深入卷积核
深入了解卷积操作
一、nn.Conv2d() (类式接口) 用法
nn.Conv2d( in_channels, out_channels, kernel_size, stride=1,padding=0, dilation=1, groups=1,bias=True, padding_mode=‘zeros’)
in_channels:输入通道
out_channels:输出通道
kernel:卷积核大小,int 或 元组 类型
stride:步长 每次滑动步长,默认1
padding:设置边界增加值 0 的边距大小 例:padding = 1,原图像 3*3 → 5*5 外扩一圈0,卷积后大小保持不变。反卷积也通过扩充边界进行操作。
dilation:对卷积核间距扩充,中间补0
深入理解:在 in_channels=m时, out_channels = n,则会有对应 n个,m通道的卷积核对应生成,通道数输入的图像通道一致,参数随机,最终输出n个。在进行卷积时,卷积核与图像的对应通道分别卷积,后加偏置Bias 输出。
代码深入理解:输入图像 [1,2,4,4],1张图像,2通道数,4*4大小 且2个通道像素点全部赋1(为了更好理解)
设置nn.Conv2d(), out_channels = 1,1个卷积核
Weight 为随机生成参数 维度[1,2,3,3] 1卷积核 2通道 3*3 卷积大小
Bias 偏置 随机
由实验得出 ,'Num 1'+'Num 2' + bias 计算的 只是 卷积后
某一点的 像素值。由(W-F+2*P)/S+1得输出为由 [2,2] 的四个点,因输入图片4*4
全为1,且卷积核参数 在卷积时参数不变,则四个点的值相等。
结果得 :'Num 1'+'Num 2' + bias 与 net(x) 内的值相等
相关链接:https://blog.csdn.net/v_JULY_v/article/details/51812459?
1 # -*- coding = utf-8 -*-
2 # @Time : 2021/8/24 19:56
3 # @Author : Lv
4 # @File : Kernel.py
5 # @ Software : PyCharm
6 import torch
7 import torch.nn as nn
8 class Net(nn.Module):
9 def __init__(self,):
10 super(Net,self).__init__() # 继承父类
11 self.conv1 = nn.Conv2d(in_channels=2,out_channels=1,kernel_size=3,stride=1,padding=0) # 大小不变
12
13 def forward(self,x):
14 x = self.conv1(x)
15 Weight = self.conv1.weight.data # 卷积核权重 [1,2,3,3]
16 Bias = self.conv1.bias.data
17 print('Weight:',Weight,sep='\n',end='\n\n')
18 print('Bias',Bias)
19 w1 = Weight[0,0,:,:] # 切片 第一个通道卷积核
20 w2 = Weight[0,1,:,:]
21 print('Num 1',sum(sum(w1))) # 对卷积核1通道加和 3*3参数直接加和 因 输入图片 全1 矩阵 可认为不用内积
22 print('Num 2',sum(sum(w2))) # 对卷积核2通道加和
23 w = sum(sum(w1)) + sum(sum(w2)) # 两通道加和
24 print('\nResult',w+Bias) # 加偏置
25
26 return x
27 x = torch.ones(1,2,4,4)
28 print('输入',x,end='\n')
29 net = Net()
30 print(net(x))