Can't instantiate abstract class MolTestDataset with abstract methods get, len
想问问大家这种情况怎么改啊 真诚发问
```python
class MolTestDataset(Dataset):
def __init__(self, data_path, target, task):
super(Dataset, self).__init__()
self.smiles_data, self.labels = read_smiles(data_path, target, task)
self.task = task
self.conversion = 1
if 'qm9' in data_path and target in ['homo', 'lumo', 'gap', 'zpve', 'u0']:
self.conversion = 27.211386246
print(target, 'Unit conversion needed!')
def __getitem__(self, index):
mol = Chem.MolFromSmiles(self.smiles_data[index])
mol = Chem.AddHs(mol)
N = mol.GetNumAtoms()
M = mol.GetNumBonds()
type_idx = []
chirality_idx = []
atomic_number = []
for atom in mol.GetAtoms():
type_idx.append(ATOM_LIST.index(atom.GetAtomicNum()))
chirality_idx.append(CHIRALITY_LIST.index(atom.GetChiralTag()))
atomic_number.append(atom.GetAtomicNum())
x1 = torch.tensor(type_idx, dtype=torch.long).view(-1,1)
x2 = torch.tensor(chirality_idx, dtype=torch.long).view(-1,1)
x = torch.cat([x1, x2], dim=-1)
row, col, edge_feat = [], [], []
for bond in mol.GetBonds():
start, end = bond.GetBeginAtomIdx(), bond.GetEndAtomIdx()
row += [start, end]
col += [end, start]
edge_feat.append([
BOND_LIST.index(bond.GetBondType()),
BONDDIR_LIST.index(bond.GetBondDir())
])
edge_feat.append([
BOND_LIST.index(bond.GetBondType()),
BONDDIR_LIST.index(bond.GetBondDir())
])
edge_index = torch.tensor([row, col], dtype=torch.long)
edge_attr = torch.tensor(np.array(edge_feat), dtype=torch.long)
if self.task == 'classification':
y = torch.tensor(self.labels[index], dtype=torch.long).view(1,-1)
elif self.task == 'regression':
y = torch.tensor(self.labels[index] * self.conversion, dtype=torch.float).view(1,-1)
data = Data(x=x, y=y, edge_index=edge_index, edge_attr=edge_attr)
return data
def __len__(self):
return len(self.smiles_data)
class MolTestDatasetWrapper(object):
def __init__(self,
batch_size, num_workers, valid_size, test_size,
data_path, target, task, splitting
):
super(object, self).__init__()
self.data_path = data_path
self.batch_size = batch_size
self.num_workers = num_workers
self.valid_size = valid_size
self.test_size = test_size
self.target = target
self.task = task
self.splitting = splitting
assert splitting in ['random', 'scaffold']
# MTD = MolTestDataset()
def get_data_loaders(self):
train_dataset = MolTestDataset(data_path=self.data_path, target=self.target, task=self.task)
train_loader, valid_loader, test_loader = self.get_train_validation_data_loaders(train_dataset)
return train_loader, valid_loader, test_loader
def get_train_validation_data_loaders(self, train_dataset):
if self.splitting == 'random':
# obtain training indices that will be used for validation
num_train = len(train_dataset)
indices = list(range(num_train))
np.random.shuffle(indices)
split = int(np.floor(self.valid_size * num_train))
split2 = int(np.floor(self.test_size * num_train))
valid_idx, test_idx, train_idx = indices[:split], indices[split:split+split2], indices[split+split2:]
elif self.splitting == 'scaffold':
train_idx, valid_idx, test_idx = scaffold_split(train_dataset, self.valid_size, self.test_size)
# define samplers for obtaining training and validation batches
train_sampler = SubsetRandomSampler(train_idx)
valid_sampler = SubsetRandomSampler(valid_idx)
test_sampler = SubsetRandomSampler(test_idx)
train_loader = DataLoader(
train_dataset, batch_size=self.batch_size, sampler=train_sampler,
num_workers=self.num_workers, drop_last=False
)
valid_loader = DataLoader(
train_dataset, batch_size=self.batch_size, sampler=valid_sampler,
num_workers=self.num_workers, drop_last=False
)
test_loader = DataLoader(
train_dataset, batch_size=self.batch_size, sampler=test_sampler,
num_workers=self.num_workers, drop_last=False
)
return train_loader, valid_loader, test_loader
```
该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
错误信息 "Can't instantiate abstract class MolTestDataset with abstract methods get, len" 表示您正在尝试创建一个抽象类的实例,该抽象类具有需要实现的抽象方法。在这种情况下,您的 MolTestDataset
类是 PyTorch 的 Dataset
抽象类的子类,它要求实现两个抽象方法:__len__
和 __getitem__
。
要解决此错误,您需要在 MolTestDataset
类中实现这两个方法,如下所示:
class MolTestDataset(Dataset):
def __init__(self, data_path, target, task):
super(MolTestDataset, self).__init__()
# ... 您的代码 ...
def __getitem__(self, index):
# ... 您的代码 ...
def __len__(self):
return len(self.smiles_data)
请注意,在构造函数中,您应该将 super(Dataset, self).__init__()
替换为 super(MolTestDataset, self).__init__()
,以调用正确的父类构造函数。此外,在 __len__
方法中,您应该返回 self.smiles_data
的长度,这是您数据集中样本的数量。
一旦您实现了这些方法,就可以创建 MolTestDataset
类的实例,而不会出现任何错误。
如果以上回答对您有所帮助,点击一下采纳该答案~谢谢
粘贴出完整的错误,我来帮你解答
题主解决了吗,我也在复现你这篇论文也是卡在finetune这里了,请问你解决了吗
请问题主解决了嘛 我也是卡在这里了