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

PyTorch报错TypeError: 'Adam' object is not callable 求助

问题排查与修复

错误原因分析

你遇到的TypeError: 'Adam' object is not callable,结合代码来看,核心问题有两个:

  1. 训练循环的梯度更新顺序完全错误,这会导致optimizer调用逻辑混乱,触发异常;
  2. 需确认parameters_1的参数组定义是否符合PyTorch要求。

修复步骤

1. 修正训练循环的步骤顺序

训练循环中梯度更新的正确流程是:清空梯度 → 前向传播 → 计算损失 → 反向传播 → 更新参数。你的代码完全颠倒了顺序,以下是修复后的train_step函数:

from typing import Dict, List, Tuple

def train_step(model: torch.nn.Module, 
               dataloader: torch.utils.data.DataLoader, 
               loss_fn: torch.nn.Module, 
               optimizer: torch.optim.Optimizer,
               device: torch.device):

  # Put model in train mode
  model.train()

  # Setup train loss and train accuracy values
  train_loss, train_acc = 0, 0

  # Loop through data loader data batches
  for batch, (X, y) in enumerate(dataloader):

      # Send data to target device
      X, y = X.to(device), y.to(device)

      # 1. 清空梯度(必须在前向传播前执行)
      optimizer.zero_grad()

      # 2. 前向传播
      y_pred = model(X)

      # 3. 计算并累加损失
      loss = loss_fn(y_pred, y)
      train_loss += loss.item() 

      # 4. 反向传播计算梯度
      loss.backward()

      # 5. 更新模型参数
      optimizer.step()

      # Calculate and accumulate accuracy metric across all batches
      y_pred_class = torch.argmax(torch.softmax(y_pred, dim=1), dim=1)
      train_acc += (y_pred_class == y).sum().item()/len(y_pred)

  # Adjust metrics to get average loss and accuracy per batch 
  train_loss = train_loss / len(dataloader)
  train_acc = train_acc / len(dataloader)
  return train_loss, train_acc

2. 确认参数组定义的正确性

使用分层学习率时,parameters_1必须是PyTorch要求的参数组列表,格式示例如下:

# 示例:针对模型不同层设置不同学习率
parameters_1 = [
    {'params': model_0.feature_extractor.parameters(), 'lr': 1e-5},  # 预训练层用小学习率
    {'params': model_0.classifier.parameters(), 'lr': 1e-3}          # 自定义分类头用大学习率
]
optimizer = torch.optim.Adam(parameters_1)

如果parameters_1不是这种结构(比如误传入了Adam对象或其他非法值),也会引发调用异常。

3. 排查其他潜在问题

检查代码中是否存在将optimizer当作函数调用的情况(比如误写了optimizer()),这种写法会直接触发'Adam' object is not callable错误。

内容的提问来源于stack exchange,提问作者Manar Saad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 20:10:32