【发布时间】:2021-07-30 15:30:30
【问题描述】:
我有一个 3 文件。在datamodule 文件中,我创建了数据并使用了PyTorch Lightning 的基本格式。在linear_model 中,我基于此page 制作了linear regression model。最后,我有一个train 文件,我正在调用模型并尝试拟合数据。但是我收到了这个错误
GPU available: False, used: False
TPU available: False, using: 0 TPU cores
Traceback (most recent call last):
File "/usr/lib/python3.8/runpy.py", line 194, in _run_module_as_main
return _run_code(code, main_globals, None,
File "/usr/lib/python3.8/runpy.py", line 87, in _run_code
exec(code, run_globals)
File "/home/mostafiz/Dropbox/MSc/Thesis/regreesion_EC/src/test_train.py", line 10, in <module>
train_dataloader=datamodule.DataModuleClass().setup().train_dataloader(),
AttributeError: 'tuple' object has no attribute 'train_dataloader'
示例数据模块文件
class DataModuleClass(pl.LightningDataModule):
def __init__(self):
super().__init__()
self.sigma = 5
self.batch_size = 10
self.prepare_data()
def prepare_data(self):
x = np.random.uniform(0, 10, 10)
e = np.random.normal(0, self.sigma, len(x))
y = x + e
X = np.transpose(np.array([x, e]))
self.x_train_tensor = torch.from_numpy(X).float().to(device)
self.y_train_tensor = torch.from_numpy(y).float().to(device)
training_dataset = TensorDataset(self.x_train_tensor, self.y_train_tensor)
self.training_dataset = training_dataset
def setup(self):
data = self.training_dataset
self.train_data, self.val_data = random_split(data, [8, 2])
return self.train_data, self.val_data
def train_dataloader(self):
return DataLoader(self.train_data)
def val_dataloader(self):
return DataLoader(self.val_data)
样本训练文件
from . import datamodule, linear_model
model = linear_model.LinearRegression(input_dim=2, l1_strength=1, l2_strength=1)
trainer = pl.Trainer()
trainer.fit(model,
train_dataloader=datamodule.DataModuleClass().setup().train_dataloader(),
val_dataloaders=datamodule.DataModuleClass().setup().val_dataloaders())
如果您需要更多代码或解释,请告诉我。
更新(根据评论)
现在,从DataModuleClass() 的__init__() 中删除self.prepare_data(),从setup() 中删除return self.train_data, self.val_data,并将test 文件更改为
data_module = datamodule.DataModuleClass()
trainer = pl.Trainer()
trainer.fit(model,data_module)
错误:
GPU available: False, used: False
TPU available: False, using: 0 TPU cores
Traceback (most recent call last):
File "/usr/lib/python3.8/runpy.py", line 194, in _run_module_as_main
return _run_code(code, main_globals, None,
File "/usr/lib/python3.8/runpy.py", line 87, in _run_code
exec(code, run_globals)
File "/home/mostafiz/Dropbox/MSc/Thesis/regreesion_EC/src/test_train.py", line 10, in <module>
train_dataloader=datamodule.DataModuleClass().train_dataloader(),
File "/home/mostafiz/Dropbox/MSc/Thesis/regreesion_EC/src/datamodule.py", line 54, in train_dataloader
return DataLoader(self.train_data)
AttributeError: 'DataModuleClass' object has no attribute 'train_data'
【问题讨论】:
-
你正在使用的设备,它有 GPU 吗?
-
问题在于
datamodule.DataModuleClass().setup().train_dataloader()。您不能在setup()的返回值上调用train_dataloader(),因为setup()返回一个元组。但是我对 PyTorch Lightning 不熟悉,所以我不知道修复它的正确方法。 -
@KnowledgeGainer 不,我没有 GPU
-
@GoodDeeds 那么我应该从
setup()中删除return吗?然后我得到AttributeError: 'NoneType' object has no attribute 'train_dataloader' -
尝试在 setup 函数中打印这两个值(self.train_data,self.val_data),并告诉你得到了什么。