【问题标题】:The learnable parameter problem of the conv2d layer in pytorch [duplicate]pytorch中conv2d层的可学习参数问题
【发布时间】:2021-06-25 22:19:28
【问题描述】:

最近尝试使用自定义的conv2d卷积层参数,目前的设置是:

        kernel = [np.array([[0., 0., 0.], [0., -1., 0.], [0., 1., 0.]]),
                  np.array([[0., 0., 0.], [0., -1., 1.], [0., 0., 0.]]),
                  np.array([[0., 0., 0.], [0., -1., 0.], [0., 0., 1.]])]
        self.weights = []
        for kernel_filter in kernel:
            kernel_filter = torch.FloatTensor(kernel_filter).unsqueeze(0).unsqueeze(0)  # (1, 1, 3, 3)
            kernel_filter = np.repeat(kernel_filter, self.channels, axis=0)
            self.weights.append(nn.Parameter(data=kernel_filter, requires_grad=True)) 
...
        for weight in self.weights:
            image_filtered = F.conv2d(x, weight, stride=[1, 1], padding=1, groups=self.channels)

经过几次训练,查看了参数值,发现并没有什么变化。请问这是为什么,或者我的理解有什么问题。

【问题讨论】:

  • 您的优化器是否包含这些参数组?
  • 是的,我使用'self.optimizer = torch.optim.Adam(filter(lambda p: p.requires_grad, self.model.parameters()), lr=0.001, betas=(0.9, 0.999))' 来优化可训练参数。这里有什么问题吗?

标签: deep-learning pytorch conv-neural-network


【解决方案1】:

打印出所有模型参数并确保它们已注册,我怀疑它们没有。见这里:How to add parameters in module class in pytorch custom model?。简而言之,仅仅因为self.weights 是模型类的属性并不意味着模型将其识别为可学习参数。要向模型表明这一点,请致电 self.register_parameter

(因此,此问题包含与链接问题相同的信息,因此可能应该关闭,尽管我可能认为这对于不太熟悉术语的人来说是获取信息的有用途径。)

【讨论】:

  • 我从您发送的链接中找到了答案,使用self.register_parameter(name=f"kernel_filter{i}", param=nn.Parameter(data=kernel_filter, requires_grad=True)),我可以从模型中看到这些参数。非常感谢!但是不知道怎么关闭问题,会自动关闭吗?
  • 我训练了一次模型,然后查看了参数值,它们没有改变。这是一个二元分类模型。有什么错误吗?
  • 前向函数是:`def forward(self, x): residuals = [] for weight in self.weights: image_filtered = F.conv2d(x, weight, stride=[1, 1] , padding=1, groups=self.channels) residuals.append(image_filtered) return torch.cat(residuals, dim=1)`
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-18
  • 2022-01-16
  • 2019-01-18
  • 1970-01-01
  • 2021-02-15
  • 2015-09-23
  • 2019-09-23
相关资源
最近更新 更多