PyTorch Lightning训练时序模型报错:object of type 'method' has no len()
问题原因与解决方案
你的错误出在StockPriceDataModule类的val_dataloader和test_dataloader方法中:
在这两个方法里,你传给DataLoader的数据源是self.test_dataloader——这是你定义的方法本身,而不是在setup中初始化的self.test_dataset数据集实例。当DataLoader尝试获取数据源的长度时,它去调用了len(self.test_dataloader),但方法对象没有__len__方法,所以抛出了TypeError: object of type 'method' has no len()。
修正后的代码
把val_dataloader和test_dataloader里的self.test_dataloader替换成self.test_dataset即可:
class StockPriceDataModule(pl.LightningDataModule): def __init__(self, train_sequences, test_sequences, batch_size = 8): super().__init__() self.train_sequences = train_sequences self.test_sequences = test_sequences self.batch_size = batch_size def setup(self, stage=None): self.train_dataset = StockDataset(self.train_sequences) self.test_dataset = StockDataset(self.test_sequences) def train_dataloader(self): return DataLoader( self.train_dataset, batch_size = self.batch_size, shuffle = False, num_workers = 2 ) def val_dataloader(self): return DataLoader( self.test_dataset, # 修正为数据集实例 batch_size=1, shuffle = False, num_workers=1, ) def test_dataloader(self): return DataLoader( self.test_dataset, # 修正为数据集实例 batch_size=1, shuffle = False, num_workers=1, )
额外提示
PyTorch Lightning会在训练/验证/测试阶段自动调用setup方法,所以你不需要手动执行data_module.setup(),可以删掉这行代码。
内容的提问来源于stack exchange,提问作者Bucky
相关产品推荐
相关产品推荐

