卷积原理
'''卷积操作是如何进行求积,求和的'''
import torch
from torch import nn
conv1=nn.conv2d(2,3,3,1,0,bias=False)
# Conv2d(2, 3, kernel_size=(3, 3), stride=(1, 1), bias=False)
nn.init.constant_(c.weight,1)
conv1.weight
'''
卷积核权重 [3,2,3,3],3组filters,每组2channels,3x3大小
Parameter containing:
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.]]]], requires_grad=True)
'''
#数据
data=torch.Tensor([[[[0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0.]],
[[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.]]]])
#torch.Size([1, 2, 6, 6])
conv1(data)
'''
输出[3,4,4]
tensor([[[[9., 9., 9., 9.],
[9., 9., 9., 9.],
[9., 9., 9., 9.],
[9., 9., 9., 9.]],
[[9., 9., 9., 9.],
[9., 9., 9., 9.],
[9., 9., 9., 9.],
[9., 9., 9., 9.]],
[[9., 9., 9., 9.],
[9., 9., 9., 9.],
[9., 9., 9., 9.],
[9., 9., 9., 9.]]]], grad_fn=<ThnnConv2DBackward>)
'''
卷积结果相等,说明卷积的操作方式为,参数为input_channes=2,output_channels=3,3组卷积,每组2个卷积核,对拥有2个channel的data分别计算(卷积核与各自对应channel相乘,再求和s),最后两组结果再求和,即s1=s+s