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

PyTorch使用Tikhonov正则化库遇AttributeError问题求助

解决AttributeError: 'WeightDecay' object has no attribute 'backward'问题

错误原因

你错误地将WeightDecay实例直接当作可反向传播的loss对象调用backward(),但这个库的WeightDecay类是用来计算带正则化的总loss,而非直接提供反向传播方法。

修正步骤及代码

  1. 将WeightDecay实例化移到训练循环外,避免重复创建对象
  2. 先计算基础交叉熵loss,再通过WeightDecay的compute_loss方法生成带正则化的总loss
  3. 对总loss调用backward(),而非WeightDecay实例
  4. 修复running_loss的累加对象(原代码中loss未定义,会引发额外错误)

修正后的完整代码:

import torch.optim as optim
import torch.nn as nn
import time
from TikhonovRegularizationTerm import WeightDecay  # 确保正确导入库

optimizer = optim.SGD(model.parameters(), lr=0.003, momentum=0.9)
time0 = time()
epochs = 15

# 提前实例化WeightDecay,传入模型和基础损失函数
loss_function = nn.CrossEntropyLoss()
regularizer = WeightDecay(model, loss_function)

for e in range(epochs):
    running_loss = 0
    for images, labels in trainloader:
        # Flatten MNIST images into a 784 long vector
        images = images.view(images.shape[0], -1)
    
        # Training pass
        optimizer.zero_grad()
        
        output = model(images)
        # 计算带正则化的总loss
        total_loss = regularizer.compute_loss(output, labels)

        # 对总loss执行反向传播
        total_loss.backward()
        
        # 更新模型参数
        optimizer.step()
        
        running_loss += total_loss.item()
    else:
        print("Epoch {} - Training loss: {}".format(e, running_loss/len(trainloader)))
print("\nTraining Time (in minutes) =",(time()-time0)/60)

额外说明

  • 该库的正则化类设计逻辑是:接收模型和基础损失函数,通过compute_loss方法结合模型输出、标签,返回包含正则化项的总loss张量,这个张量才支持backward()操作
  • 若你使用的是库中其他正则化类(如Tikhonov等),用法逻辑一致:先实例化,再调用compute_loss得到总loss,再反向传播

内容的提问来源于stack exchange,提问作者amir abbas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 03:40:16