deep-learning - 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)
训练了几次之后,查看了参数值,发现并没有什么变化。请问这是为什么,或者我在这里的理解有什么问题。
解决方案
打印出所有模型参数并确保它们已注册,我怀疑它们没有。请参见此处:如何在 pytorch 自定义模型的模块类中添加参数?. 简而言之,仅仅因为self.weights
是模型类的属性并不意味着模型将其识别为可学习参数。为了向模型表明这一点,您调用self.register_parameter
.
(因此,此问题包含与链接问题相同的信息,因此可能应该关闭,尽管我可能认为这对于不太熟悉术语的人来说是获取信息的有用途径。)
推荐阅读
- ios - 如何检测scrollToItem是否会滚动
- swift - 如何将 WKWebView 中的日历事件实现到我的 iPhone 中?
- outlook - MS Outlook 2016 功能区缩放问题
- javascript - 如何在 Axios 承诺响应中分配 $scope 中的值?
- tensorflow - 是否可以使用 Keras 来优化数学函数的系数?
- linux - bash 参数相等性检查的意外输出
- python - 如何使用 Python 和 Orange 创建 docker 容器
- aws-sct - AWS SCT 中数据提取器代理和 dms 代理之间的区别
- sql-server - CTE变成一个函数
- java - Maven如何在复制资源时仅包含选定的文件夹