You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 10:06:04