PyTorch损失函数报错TypeError: 'Tensor' object is not callable求解决
解决
TypeError: 'Tensor' object is not callable错误 问题场景
运行以下PyTorch训练代码时,在损失函数调用处触发TypeError: 'Tensor' object is not callable错误:
训练代码:
torch.manual_seed(50) epoch = 5 train_loss, train_acc = 0, 0 for epochs in range(epoch): for batch, (X, y) in enumerate(train_dataloader): model.train() y_logits = model(X) print(y_logits.shape) print(y.shape) loss = loss(y_logits, y) train_loss += loss optimizer.zero_grad() loss.backward() optimizer.step()
损失函数定义代码:
!pip install torchmetrics from torchmetrics.classification import MulticlassAccuracy loss = nn.CrossEntropyLoss() optimizer = torch.optim.SGD(params=model.parameters(), lr=0.01)
错误原因
核心是变量名冲突:
- 初始化阶段你将损失函数实例赋值给了
loss变量; - 训练循环中执行
loss = loss(y_logits, y)时,会把loss从原本的CrossEntropyLoss可调用对象,覆盖成一个Tensor类型的批次损失值; - 当进入第二个训练批次时,
loss已经是Tensor对象,无法像函数一样被调用,因此触发错误。
解决方案
给批次损失值更换一个不冲突的变量名,比如batch_loss,修改训练循环中的对应代码:
修改后的完整训练代码:
torch.manual_seed(50) epoch = 5 train_loss, train_acc = 0, 0 for epochs in range(epoch): for batch, (X, y) in enumerate(train_dataloader): model.train() y_logits = model(X) print(y_logits.shape) print(y.shape) batch_loss = loss(y_logits, y) # 更换变量名避免冲突 train_loss += batch_loss optimizer.zero_grad() batch_loss.backward() # 对应更新损失值引用 optimizer.step()
内容的提问来源于stack exchange,提问作者Ben Gazjuk
相关产品推荐
相关产品推荐

