Bootstrap

【已解决 含代码调试分析】pytorch自定义手动设置卷积核

嘿,你能搜索到这个问题,说明你说一个认真学习的同学,这个问题的细节值得思考。

欢迎收藏,会持续更新。请仔细看后面的调试界面。

什么是卷积核?

import torch
import torch.nn as nn


conv = nn.Conv2d(in_channels=2, out_channels=3, kernel_size=3, padding=1)


weights = conv.weight.data
bias = conv.bias.data

print(weights,bias)

卷积内部结构

卷积核内部结构

如何读取到卷积核的参数

weights = conv.weight.data

请仔细查看上图,data就是卷积核的参数

因为是随机初始化,所以每次的打印参数是不同的,这也是深度神经网络初始化化的灵活和智能的地方。

将卷积核打印的结果如下,

tensor([[[[ 0.1893,  0.0552, -0.0750],
          [ 0.1262, -0.1618, -0.2354],
          [-0.2163,  0.2291,  0.0963]],

         [[-0.0693, -0.1937, -0.0213],
          [-0.0298,  0.0651, -0.1869],
          [ 0.1028,  0.1950,  0.0694]]],


        [[[-0.1232, -0.0495,  0.0629],
          [-0.0371, -0.0678,  0.1135],
          [-0.1018, -0.1268, -0.0859]],

         [[ 0.1542,  0.1547, -0.1837],
          [-0.0826,  0.1594,  0.1576],
          [-0.2143,  0.0757,  0.1609]]],


        [[[-0.0950,  0.1961, -0.0389],
          [-0.1242, -0.1088, -0.2074],
          [-0.0329,  0.0995,  0.0287]],

         [[-0.0407, -0.0652,  0.0776],
          [ 0.0919, -0.1914,  0.1765],
          [-0.2123, -0.2341,  0.1367]]]]) tensor([-0.2304,  0.2258,  0.0310])

为什么某些时候需要自定义卷积核

例如迁移学习,或者使用固定参数初始化等,有些模型的初始化并不一样,都可能需要使用到自定义卷积核。

如何自定义卷积核

import torch
import torch.nn as nn


conv = nn.Conv2d(in_channels=2, out_channels=3, kernel_size=3, padding=1)


weights = conv.weight.data
bias = conv.bias.data


a = torch.ones_like(conv.weight.data)

conv.weight.data = a

print(conv.weight.data)

找到卷积核所在的tensor,conv.weight.data,然后对其赋值操作。

运行结果

tensor([[[[1., 1., 1.],
          [1., 1., 1.],
          [1., 1., 1.]],

         [[1., 1., 1.],
          [1., 1., 1.],
          [1., 1., 1.]]],


        [[[1., 1., 1.],
          [1., 1., 1.],
          [1., 1., 1.]],

         [[1., 1., 1.],
          [1., 1., 1.],
          [1., 1., 1.]]],


        [[[1., 1., 1.],
          [1., 1., 1.],
          [1., 1., 1.]],

         [[1., 1., 1.],
          [1., 1., 1.],
          [1., 1., 1.]]]])

调试查看结果

设置断点

还没赋值,所以初始化参数是 不确定的

自定义赋值给卷积核后,参数变成我们想要的数值。

这个自定义是卷积核是高级操作,更多不理解的,

卷积的数值也是tensor,tensor能有的操作都可以做。如果对这句话不理解,看我另外一篇文章:

pytorch 数据类型基础,与Python数据类型的区别,为什么要另外设置新的pytorch 数据类型?icon-default.png?t=O83Ahttps://blog.csdn.net/weixin_60214220/article/details/142344382?spm=1001.2014.3001.5501

深度学习神经网络的内容,欢迎关注收藏,会持续更新,如果你遇到什么疑问,也可以评论和留言,大家共同进步。

;