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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 10:53:08