嘿,你能搜索到这个问题,说明你说一个认真学习的同学,这个问题的细节值得思考。
欢迎收藏,会持续更新。请仔细看后面的调试界面。
什么是卷积核?
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能有的操作都可以做。如果对这句话不理解,看我另外一篇文章:
深度学习神经网络的内容,欢迎关注收藏,会持续更新,如果你遇到什么疑问,也可以评论和留言,大家共同进步。