PyTorch模型训练报错:forward()仅接受2个参数却传入3个
问题分析与解决方案
报错根源
- Embedding类参数不匹配:主模型
forward中调用self.embedding(x, frames)时传入了2个输入参数,但你的Embedding类forward方法仅定义了self + 1个输入的参数结构,导致实际调用时传递了3个参数(self+x+frames),触发TypeError。 - 主模型forward参数缺失:主模型
forward仅接收frames参数,但内部调用self.decoder(x, phrase)时,phrase变量未定义,后续必然报错。 - 模型输入与数据加载不匹配:数据加载返回的输入是包含
frames和phrase的字典,但训练循环中仅传递了frames相关数据,未给模型传入phrase,与decoder的需求冲突。
修复步骤
1. 修正Embedding类的forward方法
根据实际需求调整Embedding类的参数结构,确保能接收主模型传入的参数:
class Embedding(nn.Module): def __init__(self): super().__init__() # 根据你的数据维度定义嵌入层,示例: self.frame_emb = nn.Linear(你的frames特征维度, 嵌入维度) # 匹配主模型的调用参数:接收x和frames def forward(self, x, frames): # 实现你的嵌入逻辑,示例: embedded_frames = self.frame_emb(frames) # 结合x的处理逻辑... return embedded_frames
如果Embedding仅需一个输入参数,直接修改主模型中的调用为x = self.embedding(x)或x = self.embedding(frames)即可。
2. 修正主模型的forward方法
让主模型同时接收frames和phrase两个输入参数:
def forward(self, frames, phrase): # Frames处理 x = self.frames_inp(frames) # Embedding(确保与Embedding类参数匹配) x = self.embedding(x, frames) # Encoder处理 x = self.encoder(x, frames) # Decoder处理:传入phrase参数 x = self.decoder(x, phrase) # 分类器输出 outputs = self.classifier(x) return outputs
3. 修正训练循环的模型调用
正确从数据加载器中解包参数并传入模型:
for batch in train_dataloader: # 解包:inputs是包含frames和phrase的字典,y是标签 inputs, y = batch frames = inputs['frames'] phrase = inputs['phrase'] # 传入两个参数到模型 outputs = model(frames, phrase) # 补充训练流程(你当前代码缺失的部分) loss = loss_fn(outputs, y) optimizer.zero_grad() loss.backward() optimizer.step() # 收集预测结果 predictions.append(outputs.cpu().numpy())
额外检查
- 确保
Encoder和Decoder类的forward方法参数与主模型中的调用匹配(比如encoder(x, frames)需要Encoder的forward能接收两个参数)。 - 验证各层输入输出维度是否兼容,避免后续出现维度不匹配错误。
内容的提问来源于stack exchange,提问作者Matthew Zhong
相关产品推荐
相关产品推荐

