解决TypeError: unsupported operand type(s) for +: ‘filter‘ and ‘filter‘

调试代码,问题比较多,记录一下解决问题的方法,

完整报错:

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 不知道如何处理这两个迭代器的合并,因此引发了错误。

解决方案:

  1. 使用列表合并

    • 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)
    

  2. 使用 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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值