PyTorch报错TypeError: 'Adam' object is not callable 求助
问题排查与修复
错误原因分析
你遇到的TypeError: 'Adam' object is not callable,结合代码来看,核心问题有两个:
- 训练循环的梯度更新顺序完全错误,这会导致optimizer调用逻辑混乱,触发异常;
- 需确认
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
相关产品推荐
相关产品推荐

