PyTorch自定义NeuralNet调用super()后仍报属性错误问题咨询
问题根因
报错核心是实例化NeuralNet时nn.Module的父类初始化逻辑没正常执行,和你写的super().__init__()代码本身无关,是Jupyter环境跨ipynb导入的常见坑,一般是以下两种情况导致:
model.ipynb的单元格存储顺序错乱。你在notebook里写代码时可能先建了写NeuralNet类的单元格,后面才建写import torch.nn as nn的单元格,notebook保存文件时是按单元格创建顺序存的,不是按你手动运行的顺序。用ipynb.fs.full导入时会严格按照文件内存储的单元格顺序从上到下执行,跑到类里的nn.Linear赋值逻辑时,要么nn还没被导入,要么类的初始化上下文异常,导致父类初始化没生效。- Jupyter内核缓存了旧版本的类。你之前写
NeuralNet类的时候一开始没加super().__init__(),后来补上了代码但没重新运行类定义的单元格,也没重启train文件的内核,导入时加载的还是内存里存的旧版类,旧版类根本没调用父类初始化方法,给类赋值nn层的时候就会触发这个属性错误。
修复步骤
- 先整理
model.ipynb结构:把import torch、import torch.nn as nn这类导入语句全部放到notebook最顶部的第一个单元格,后面再放NeuralNet类的定义。你现在贴的类代码缺了forward前向传播方法,记得补上,不然后续训练跑不通。整理完之后重启model.ipynb的内核,从上到下逐格运行所有单元格,确认直接在model.ipynb里实例化NeuralNet不会报错。
补全后的NeuralNet参考代码:import torch import torch.nn as nn class NeuralNet(nn.Module): def __init__(self, input_size, hidden_size, num_classes): super().__init__() self.l1 = nn.Linear(input_size, hidden_size) self.l2 = nn.Linear(hidden_size, hidden_size) self.l3 = nn.Linear(hidden_size, num_classes) self.relu = nn.ReLU() def forward(self, x): out = self.l1(x) out = self.relu(out) out = self.l2(out) out = self.relu(out) out = self.l3(out) return out - 切回
train.ipynb,直接重启整个内核清空所有缓存变量,把所有导入语句放到notebook顶部再逐格运行。初学阶段不建议把代码拆到多个ipynb文件里导入,跨ipynb导入的缓存、顺序问题非常多,直接把NeuralNet类复制到train.ipynb里先把训练逻辑跑通,后续功能稳定了再拆成独立的.py文件就行。 - 额外提醒:你现在写的
ChatDataset类缺了__getitem__和__len__方法,后续跑DataLoader会报错,记得补上,参考写法:class ChatDataset(Dataset): def __init__(self): self.n_samples = len(x_train) self.x_data = x_train self.y_data = y_train def __getitem__(self, index): return self.x_data[index], self.y_data[index] def __len__(self): return self.n_samples
内容的提问来源于stack exchange,提问作者Grace
相关产品推荐
相关产品推荐

