深度学习-一篇入门

【模型】一篇入门之-CNN的卷积运算

作者 : 老饼 发表日期 : 2024-01-18 11:22:13 更新日期 : 2024-11-01 22:41:15
本站原创文章,转载请说明来自《老饼讲解-深度学习》www.bbbdata.com



卷积运算(Convolution)是CNN卷积神经网络中最基本、最常用的运算,它用于融合图像的信息

本文讲解CNN卷积的基本运算、卷积的输入输出通道,以及卷积运算的意义,并展示卷积运算的代码实现

通过本文,可以快速了解CNN的卷积运算是什么,有什么作用,以及如何对输入进行卷积运算




     01. CNN的卷积运算是什么    




本节介绍CNN的卷积运算的具体计算原理,以及卷积运算的意义




     什么是CNN的卷积运算    


CNN中的卷积运算是指,用一个矩阵作为卷积核,对输入从左到右、从上到下进行卷积运算
  以下是一个CNN卷积运算的示例:
 一个CNN卷积运算的示例
它就是以卷积核为权重,对输入从左到右,从上到下进行卷积运算,具体计算过程如下:
 CNN卷积运算具体计算过程 
如上所示,把卷积核当作窗口
然后从左到右,从上往下移动卷积核窗口,将窗口覆盖的每一小块输入进行加权,就可以得到卷积输出





     CNN卷积运算的意义     


 CNN卷积运算的生物意义
 
卷积运算主要用于图像,它在生物意义上,就相当于用眼睛来扫描图像
 CNN卷积运算的生物意义
卷积核相当于眼睛,它的大小就是视野范围,卷积核的权重则是眼睛每一个神经元的接收权重
由于视野有限,所以需要通过逐步移动来查看所有内容,其中眼睛移动的步幅就是卷积的步幅
 因此,卷积核也称为接受器,而卷积核的大小则称为接受野
  CNN卷积运算的数学意义  
卷积层的数学意义就是将每个像素整合周边的信息,使得像素之间产生信息共享
其中,卷积核的大小就是信息共享的范围,卷积核的权重就是信息共享的权重   
 CNN卷积运算的数学意义
如果从卷积输出结果的视角来看,每个卷积结果都融合了某一块输入的信息
而如果从输入的视角来看,则每个输入像素的信息,都通过卷积传播到某一块输出之中
 如果经过多层卷积,一个单独的像素信息,将不断扩散到更大的范围中去,使得信息共享更加充分







    02. CNN的多通道卷积    





本节讲解多输入、或多输出通道的CNN卷积运算是什么





     CNN卷积的输入输出通道    


CNN卷积-多输入通道
CNN的卷积运算支持多通道输入,此时卷积核为三维矩阵,第三维与输入通道保持一致
 CNN卷积-多输入通道
如图所示,输入共有3个通道,则卷积核对应地也有3个通道,
然后每次卷积运算时,将卷积核窗口覆盖的输入元素进行加权合并,作为输出
CNN卷积-多输出通道
CNN的卷积运算也支持多通道输出,如果输入也是多通道,那么此时卷积核就是四维矩阵
 CNN卷积-多输出通道
如图所示,多通道输出卷积只需要理解为多个独立的卷积核就可以了
需要输出多少个输出通道,就使用多少个卷积核,每个卷积核用来计算一个输出通道的结果









     03. 卷积的参数与实现    




本节讲解卷积的常见参数与在pytorch中如何实现CNN的卷积




     卷积的常用参数     


下面介绍卷积中常用的一些参数,可以通过这些参数的意义来了解卷积的相关拓展
卷积的参数
 
卷积层一般可以设置如下的参数:
👉卷积核的大小:卷积窗口的大小,一般设为正方形,即长宽一致
👉卷积核的通道数:卷积核的通道数必须与输入的通道数一致       
👉卷积核个数:卷积核的个数就是输出的通道数                           
👉步幅:窗口移动的步长,一般设为1                                          
👉填充像素:卷积计算前,对输入的上下左右的填充像素              
👉是否带阈值:如果带阈值,则卷积结果需要再加上一个阈值参数 
 卷积核与阈值都是模型的待训练参数






     pytorch中卷积计算例子    


pytorch中使用torch.nn.Conv2d函数来实现卷积的计算
以上述卷积为例,在pytorch中可以如下实现:
import torch
X =  torch.tensor([[[[1,3,1,2],[2,6,8,5],[4,2,1,0]]]], dtype=torch.float32)    # 输入数据
c = torch.nn.Conv2d(1, 1, kernel_size=(2,2),bias = False)                      # 初始化卷积类
c.weight.data =torch.tensor([[[[1,2],[2,0]]]], dtype=torch.float32)            # 设置权重 
out = c(X)                                                                     # 对输入进行卷积计算
#-------------打印结果-----------------------
print('输入数据:',X)                 
print('卷积核:',c.weight.data)
print('卷积结果:',out)
代码运行结果如下:
 CNN卷积运算代码运行结果





好了,以上就是CNN的卷积计算的全部内容了~








 End 






联系老饼