调试代码,问题比较多,记录一下解决问题的方法,
完整报错:
Traceback (most recent call last): File "train.py", line 101, in <module> optimizer = torch.optim.Adam(filter(lambda p: p.requires_grad, posenet.parameters()) + filter(lambda p: p.requires_grad, bdb3dnet.parameters()), lr=opt.lr) TypeError: unsupported operand type(s) for +: 'filter' and 'filter'
错误分析:
TypeError
是因为尝试将两个 filter
对象直接相加。在 Python 中,filter
函数返回一个迭代器,这些迭代器不能直接使用加法操作符(+
)合并。试图将两个 filter
对象相加时,Python 不知道如何处理这两个迭代器的合并,因此引发了错误。
解决方案:
-
使用列表合并:
- 将
filter
函数的结果转换为列表,并使用列表的加法操作来合并它们。
import torch.optim as optim # 获取两个网络的参数,将filter结果转换为列表并合并 combined_params = list(filter(lambda p: p.requires_grad, posenet.parameters())) + \ list(filter(lambda p: p.requires_grad, bdb3dnet.parameters())) # 创建优化器 optimizer = optim.Adam(combined_params, lr=opt.lr)
- 将
-
使用
itertools.chain
合并两个迭代器。此方法不需要创建中间列表,直接在迭代器层面合并。
import torch.optim as optim
from itertools import chain
# 使用itertools.chain合并参数迭代器
combined_params = chain(filter(lambda p: p.requires_grad, posenet.parameters()),
filter(lambda p: p.requires_grad, bdb3dnet.parameters()))
# 创建优化器
optimizer = optim.Adam(combined_params, lr=opt.lr)
3.确保requires_grad
为True的参数:
- 确保您在这两个网络中正确设置了
requires_grad
,只有需要计算梯度的参数才会被优化器考虑
实验中参数较多,使用第二种方法
本文源代码:
opt.branch == 'jointnet':
# optimizer = torch.optim.Adam(filter(lambda p: p.requires_grad, posenet.parameters()) + filter(lambda p: p.requires_grad, bdb3dnet.parameters()), lr=opt.lr)