PyTorch使用Tikhonov正则化库遇AttributeError问题求助
解决AttributeError: 'WeightDecay' object has no attribute 'backward'问题
错误原因
你错误地将WeightDecay实例直接当作可反向传播的loss对象调用backward(),但这个库的WeightDecay类是用来计算带正则化的总loss,而非直接提供反向传播方法。
修正步骤及代码
- 将
WeightDecay实例化移到训练循环外,避免重复创建对象 - 先计算基础交叉熵loss,再通过
WeightDecay的compute_loss方法生成带正则化的总loss - 对总loss调用
backward(),而非WeightDecay实例 - 修复
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
相关产品推荐
相关产品推荐

