深入卷积核

深入了解卷积操作

一、nn.Conv2d() (类式接口) 用法

nn.Conv2din_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))

 

posted @ 2021-08-24 20:38  葛优猿  阅读(139)  评论(2)    收藏  举报