关于CNN卷积的一些知识

问题最开始出现在某篇论文中写的The Transformer Architecture部分的不理解,具体内容如下

In our mothod, a convolution layer with kernel_size 1 is used as the feature embedding module to project the 3-channel pixel values into C-dimensional feature tokens.
These feature tokens are gathered with shape HWC,where H,W and C are the height, width and feature dimension.
The shifted window mechanism first reshapes the feature maps of each frame to HW M^2 ×M^2 ×C features by partitioning the input into non-overlapping M × M local windows,where HW/M^2 is the total number of windows.

这段中,提到了:

kernel_size = 1*1

input_channel = 3

local_window_size = M*M

local_window_number = HW/M^2

以及 feature tokens 的shape = HWC

在这篇论文中采用卷积神经网络获取输入图像的特征图

因为看这篇文章之前,对于CNN不是很了解,所以对于这些参数以及具体的工作原理都不清楚,于是看了李宏毅老师的机器学习课程,(简化版)学习笔记如下:

课程链接附上:李宏毅机器学习
receptive field部分的一些参数

第一种解释

receptive field 接受域

①在CNN中,有很多神经元(Neuron),每一个神经元需要关注的区域叫receptive field,它的高和宽就叫做kernel_size(也就是等于卷积核的宽和高);同一个receptive field需要一组Neuron去处理,同组的Neuron是负责观测同一receptive field中可能出现的不同的特征.

eg:例如在一组Neuron中,Neuron1是观测鸟嘴的,Neuron2是观测鸟爪的,如果在receptive field中出现了鸟嘴,那么Neuron1将会观测到。

②接上,stride(这个一般是一个自己决定的参数)是步长,就是移动的大小,图中stride = 2 ,意思是将上一个receptive field向旁边移动两个单位的距离(应该是指两个像素的距离),得到一个新的receptive field.

③如果receptive field在移动的过程中超过了图片的范围,那么我们可以进行padding操作(填充),一般是补0,当然也可以补1或者补平均值。

④overlap的意思是,receptive field 与receptive field之间是可以重叠的。

parameter sharing 共享参数

filter
①每一个receptive field都只有一组参数,其中的参数叫 filter (滤波器),我自己的理解感觉其实就是一个receptive field有一组Neuron,然后每一个Neuron都一组自己的参数,然后这个parameter sharing 的意思就是在每一组Neuron中识别同一东西的Neuron拥有的参数是一样的。

说明:负责观测receptive_field_1区域的一组Neuron有识别鸟嘴的Neuron_1,负责观测receptive_field_2区域的一组Neuron中有识别鸟嘴的Neuron_2,这个Neuron_1的参数和Neuron_2的参数是一样的,都是filter_1.

这个Filter的作用就是抓取image(图像)中的某一个patten(图案)

小结:

CNN相比于全连接网络的非常关键的一个改进就是有了receptive field 和 parameter sharing 这两个概念,receptive field就是让Neuron每次都只关注一小片区域而不是关注全部,这样可以大量减少计算量;第二个就是parameter sharing共享了参数,这样也减少很多工作量。
1

Receptive field + Parameter Sharing = Convolutional Layer

有CNN的Model的bias (局限性)比较大 ,当模型的bias比较小时,即弹性大时,容易出现 overfitting(过拟合)的情况

第二种解释

是从Filter的角度来说明
convolutional layer

关于Filter的理解(Filter也叫卷积核)

①一个Convolutional Layer由很多的Filter组成,Filter就是上文提到的Parameter Sharing.

个人理解:第一个角度不是说观测每一个receptive field的Neuron组共享参数嘛,每个Neuron组的每一个参数都是共享的,假设每一个Neuron组中有64个Neuron,每一个Neuron的参数就是不同的Filter,然后都共享参数,大家一起共享64个Filter,所以这一个Convolutional Layer就有64个Filter

②相当于现在就是每一个Filter与每一个receptive field分别进行内积计算了,最后所有的结果汇总到一起就是feature map(特征图),在知乎上的文章里找到一张图,可以很好的表示:

转载来自知乎
备注:上面的feature map的颜色,只是为了表示不同的卷积核对应的输出通道结果,不是表示对应的输出颜色

关于Filter与Receptive field的计算过程

单个filter与一个input的计算过程
说明:input是一个width = 5,height = 5,channel = 1的图片,Filter是一个3 * 3 * 1的一个tensor,也就是kernel_size = 3 * 3并且channel = 1;输入的图片的channel是多少,Filter的channel就是多少.

现在来看看多通道的情况,(filter的个数仍然是1个,只不过是channel数目变成了3)
channel = 3
这边也是借用了别人的一张图,很好的说明了多channel的情况,如果input的channel = 3,那么Filter的channel = 3.

Filter的channel数目与Filter的个数

在学习的过程中,我一直有一个弄不清楚的东西,就是Filter的Channel数和Filter的数目
Multiple Convolutional Layer
说明:假设有一张小猫咪的彩色图片,那么image的channel = 3 ;有两个相连的Convolutional Layer相连在一起。图中标注了第一个Convolutional Layer的Filters = 64 (有64个filter)

那么第一个Convolutional Layer得到的Feature Map将会是一个 64个Channel,因为每个filter会产生一个Feature map, 这个feature map的channel 数目是1,然后64个filter产生64个feature map,合并起来得到一个channel = 64的feature map

那么单个filter的channel是多少呢,等于 3 !!因为输入的图片的channel = 3 ,具体如下图:process
而具体filter1 如何得到 feature_map1的,过程就是这样:
process2
如果带入具体的数值的话就是下图所示:
1
总结:

1:输入通道个数 = filter的channel数

2:filter个数 = 输出通道个数(输出的Feature Map的channel)

下面的代码可以跑一下然后加深理解

import torch

in_channels = 5 #输入通道数量
out_channels = 10 #输出通道数量
width = 56 #每个输入通道上的卷积尺寸的宽
heigth = 56 #每个输入通道上的卷积尺寸的高
kernel_size = 3 #每个输入通道上的卷积尺寸
batch_size = 1 #批数量

input = torch.randn(batch_size,in_channels,width,heigth)
conv_layer = torch.nn.Conv2d(in_channels,out_channels,kernel_size,stride=2,padding=0)

out_put = conv_layer(input)

print(input.shape)
print(out_put.shape)
print(conv_layer.weight.shape)

output

torch.Size([1, 5, 56, 56])
torch.Size([1, 10, 27, 27])
torch.Size([10, 5, 3, 3])

最后再回到开头,来理解一些论文中所提到的一些参数就很简单了。

  • 9
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值