首页 > 解决方案 > pytorch中conv2d层的可学习参数问题

问题描述

最近尝试使用自定义的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)

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

标签: deep-learningpytorchconv-neural-network

解决方案


打印出所有模型参数并确保它们已注册,我怀疑它们没有。请参见此处:如何在 pytorch 自定义模型的模块类中添加参数?. 简而言之,仅仅因为self.weights是模型类的属性并不意味着模型将其识别为可学习参数。为了向模型表明这一点,您调用self.register_parameter.

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


推荐阅读