Mikoto10032 / AutomaticWeightedLoss

Multi-task learning using uncertainty to weigh losses for scene geometry and semantics, Auxiliary Tasks in Multi-task Learning
Apache License 2.0
575 stars 81 forks source link

您好,我在使用您的代码时碰到了这种问题 #6

Closed tianle-BigRice closed 2 years ago

tianle-BigRice commented 3 years ago

TypeError: optimizer can only optimize Tensors, but one of the params is list

我的optimizer代码为

`
def get_optimizer(self):

    lr = opt.lr
    params = []
    # 此处个人理解为传参进入dict有偏置的学习率乘2无权重衰减(也即无惩罚项)
    # 无偏置项的学习率不变,有权重衰减
    for key, value in dict(self.named_parameters()).items():
        if value.requires_grad:
            if 'bias' in key:
                params += [{'params': [value], 'lr': lr * 2, 'weight_decay': 0}]
            else:
                params += [{'params': [value], 'lr': lr, 'weight_decay': opt.weight_decay}]
    if opt.use_adam:
        self.optimizer = t.optim.Adam([params, {'params': self.awl.parameters(), 'weight_decay': 0}])
    else:
        self.optimizer = t.optim.SGD([params, {'params': self.awl.parameters(), 'weight_decay': 0}], momentum=0.9)
    return self.optimizer

`

我想请问这样导入parameters是有什么问题吗?如果有问题的话请问您有什么解决方案吗?

tianle-BigRice commented 3 years ago

或者说您的这个loss是仅仅能用与adam优化器吗?

tianle-BigRice commented 3 years ago

问题解决了,当进行自定义的optimizer时,由于我是在函数外定义self.awl = AutomaticWeightedLoss(2)。因此此时的self.awl为生成器对象,如果此时直接将其于model.parameters合为list时,会显示无法识别。此时可以将awl = AutomaticWeightedLoss(2)放于函数内,此时就能正常使用了。

tianle-BigRice commented 2 years ago

问题解决方案就是不能将awl放入网络中,作为网络的self使用。而只能将awl作为一个单独的模块来使用。