在CNN中,卷积层可以通过输入与filter做对应的操作,得到输出。
在下面函数中,in_ch:in channels;out_ch:out channels;3:kernel size
nn.Conv2d(in_ch, out_ch, 3)
那么具体是如何计算的呢
这是整个CNN的计算流程。其中最顶行为操作名称,第二行是(H,W,C),最下一行是值的色阶图。
下图中,输入为RGB图像,即in_ch=3,out_ch=10,kernel size=3x3
最下面一行可知,img的3个通道都是被归一化到[0,1]的;而Kernel则是随机的值,有正值有负值也有0;而且,三个通道对应的Kernel是不相同的。左边一列是img的三个通道(in channels)与对应Kernel做卷积操作;中间一列是卷积得到的中间产物;沿着虚线往后,则是不同通道的卷积中间产物相加,并加上一个偏移值Bias,得到一个输出通道。
也就是说n个in channel与n个Kernel做卷积得到n个intermediate,n个intermediate相加并加上Bias得到一个out channel(feature map)。
此处有个疑问:同一个out channel对应的filter到底是不是相同的,例子里是不同的,但是,很多博客都说是一个filter对应一个feature map。还是说,一个filter本身也是有与in channels对应数量的channels。请大佬解惑
对此问题,找到了一个满意的答案:解释1,解释2,filter是由n个kernel堆叠而成的,filter size:(H,W,C),一个filter对应一个feature map的说法是对的。
为什么每一层卷积都需要做非线性操作(激活操作):就是因为Kernel的值是随机的,有正有负有零。
ReLU:f(x)=max(0,x)
上图是一个卷积操作,Kernel在channel上滑动,计算Kernel的值与对应位置的channel的值,求和得到一个值,即为Kernel对应channel位置的输出。由于padding=0,stride=1,所以Output的值要比Input小2。
Output的计算公式为:
Output = (Input - k - 2 * padding) / stride +1
为了方便理解,可以参考:cnn-explainer
以下内容有些跑题,但还是想补充一下。
一个filter也称为一个神经元(neuron),其覆盖的区域称为感受域(receptive field);
filter的值也成为权重(weights)或参数(parameters);
CNN中某一卷积层权重的计算公式:
假设
in channels:in_ch,
out channels:out_ch,
kernel size:k = m x n
weights = (m * n * in_ch) * out_ch + bias
= (m * n * in_ch + 1) * out_ch
解释一下这个公式怎么来的,一个filter对应一个feature map(也就是out channel),filter的channels又等于in channels;一个filter对应一个bias。
结合上面这个图会更好理解,输入有3个通道,filter也有3个通道,filter的size为(3, 3),一个filter对应一个bias,输出有10个通道。
所以按上面的公式:
wtights = (3 * 3 * 3 + 1) * 10
但是这样子看,权重和图像的size没毛关系啊
FLOPs衡量模型复杂度:
FLOPS:注意全大写,是floating point operations per second的缩写,意指每秒浮点运算次数,理解为计算速度。是一个衡量硬件性能的指标。
FLOPs:注意s小写,是floating point operations的缩写(s表复数),意指浮点运算数,理解为计算量。可以用来衡量算法/模型的复杂度。作者:chen liu
链接:https://www.zhihu.com/question/65305385/answer/451060549
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
卷积层计算FLOPs: