PyTorch训练自定义网络报NotImplementedError是什么原因?
错误直接原因
你触发NotImplementedError的核心问题是前向传播方法名拼写错误:
你定义的是def foward(self, x):,正确的PyTorch要求的方法名是forward(少了一个字母r)。调用model(inputs)时会自动调用类的forward方法,你拼写错误后就会执行父类nn.Module的默认forward方法,而父类的这个方法就是直接抛出NotImplementedError。
其他存在的问题
- 代码里残留无效字符:
running_loss += loss.item()后面多了`enter code here`的无效标记,运行时会报语法错误 - 需求功能未实现完全:缺少验证集损失计算、损失曲线绘制逻辑,也没有显式设置
batch_size=64的代码 - 损失函数搭配不合理:你最后一层用了
Sigmoid,但损失函数用了CrossEntropyLoss,CrossEntropyLoss内部自带了Softmax,不需要额外加Sigmoid/Softmax层,会导致梯度收敛变慢
修正后的完整代码
import numpy as np import matplotlib.pyplot as plt import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader # 此处假设你已经定义好了train_dataset和val_dataset,根据你的实际数据替换即可 # 显式设置batch_size=64 batch_size = 64 train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True) val_loader = DataLoader(val_dataset, batch_size=batch_size, shuffle=False) class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.net_layer = nn.Sequential( nn.Flatten(), nn.Linear(64*64,30) # 移除Sigmoid,CrossEntropyLoss自带Softmax逻辑 ) # 修正方法名拼写为forward def forward(self, x): x = self.net_layer(x) return x model = Net() nepochs = 20 # 可根据需求调整epoch数量 # 分别存储训练和验证损失 train_losses = np.zeros(nepochs) val_losses = np.zeros(nepochs) loss_fn = nn.CrossEntropyLoss() optimizer = optim.SGD(model.parameters(), lr=0.001, momentum=0.9) for epoch in range(nepochs): # 训练阶段 model.train() running_train_loss = 0.0 train_n = 0 for inputs, labels in train_loader: optimizer.zero_grad() outputs = model(inputs) loss = loss_fn(outputs, labels) loss.backward() optimizer.step() running_train_loss += loss.item() train_n += 1 train_losses[epoch] = running_train_loss / train_n # 验证阶段,每个epoch计算完整验证集损失 model.eval() running_val_loss = 0.0 val_n = 0 with torch.no_grad(): # 验证阶段关闭梯度计算,节省内存提速 for inputs, labels in val_loader: outputs = model(inputs) loss = loss_fn(outputs, labels) running_val_loss += loss.item() val_n += 1 val_losses[epoch] = running_val_loss / val_n print(f"epoch: {epoch+1} 训练损失: {train_losses[epoch]:.3f} 验证损失: {val_losses[epoch]:.3f}") # 绘制损失变化曲线 plt.plot(range(1, nepochs+1), train_losses, label='训练损失') plt.plot(range(1, nepochs+1), val_losses, label='验证损失') plt.xlabel('Epoch') plt.ylabel('损失值') plt.legend() plt.show()
内容的提问来源于stack exchange,提问作者haruto
相关产品推荐
相关产品推荐

