一、普通卷积
1、多通道输入,单通道输出
输入为三通道的6*6*3,过滤器也是三通道的分别对应RGB三个通道。其中:
- 过滤器的通道数需要和被卷积目标的通道数保持一致。
- 输出通道数=卷积核个数
计算过程包含了先卷积再融合的过程。3个通道各种卷积得到一个值,然后3个通道的值相加得到最终的值。具体来说:首先会拿这个3*3*3的卷积核放到最左上角的位置,这个3*3*3的卷积核有27个数字,分别与原始图像对应的27个数字做内积,这样就得到了第一个数字,然后再根据相应的步长向右、向下移动。
2、多通道输入,多通道输出
随着神经网络层数的加深,我们常会增加输出通道的维数,通过减少空间分辨率以获得更大的通道深度。直观地说,我们可以将每个通道看作是对不同特征的反应。
6*6*3的图像和两个3*3*3的过滤器卷积,得到4*4*2的输出。
所以,假设c0表示输入通道数,c1表示输出通道数,则有n*n*c0和一个c1*f*f*c0的卷积核进行处理,得到m*m*c1的输出。
以上参考:https://www.cnblogs.com/ml-JoJo/p/16630037.html
3、总结
单通道输出是多通道输出的一种特殊情况。
CNN中完整的卷积是对于两个4维张量进行操作。其中输入X大小为N*C*H*W,分别代表了batch_size, input_channel, input_height, input_width。而卷积核大小为D*C*K*K,分别代表输出通道数,输入通道数,卷积核尺寸。在每个输出通道上如第(1)中所示,由C*K*K的单个卷积核与C*H*W输入通道分别进行卷积,再累加在一起形成该输出通道上的二维的输出。
使用代码可以表示为:out = torch.einsum( 'nchwkj,dckj->ndhw', x, weight)
上文参考:https://zhuanlan.zhihu.com/p/349683405
二、深度卷积(Depthwise Convolution)
所谓深度卷积,在进行卷积的时候,只是各个输入通道对应相乘,而不在输入通道上进行累加求和。它满足:
- 卷积核channel=1
- 输入特征矩阵channel=卷积核个数=输出特征矩阵channel
- 卷积核权重shape为C*1*K*K
使用代码可以表示为:out = torch.einsum('nchwkj,ckj->nchw', x, weight)
三、分组卷积(Group Convolution)
分组卷积就是在进行卷积运算时,输入通道不是全部参与计算,而是分割开来成为几组,每组内部进行正常卷积。
四、参数量计算
(1)普通卷积
输入L,输出K,滤波器大小N*M,则权重总数为:(N*M*L+1)*K
解释:输入有L=32个特征图,K=64个特征图作为输出,滤波器大小为N=3、M=3,它是一个3*3*32的过滤器。因为我们的输入有32个维度,我们学习64个不同的3*3*32过滤器,因此总权重的总数为N*M*L*K。然后每个特征图也有一个偏置项,所以我们的参数总数为(N*M*L+1)*K
(2)全连接
输入N,输出M,权重总数为:(N+1)*M
解释:对于N个输入和M个输出,权重数为N*M。此外,对每个输出节点都有一个偏差,因此有(N+1)*M个参数。
(3)深度可分离卷积
输入L,输出K,滤波器大小为N*M,则权重总数为:(N*M*1+1)*L+(1*1*L+1)*K
假设卷积核大小为3*3,输入通道为16,输出通道为32。
普通卷积:(3*3*16+1)*32=4640个
深度可分离卷积:先用16个3*3的卷积核(3*3*1)作用于16个通道的输入图像,得到了16个特征图。在做融合操作之前,接着用16个大小为1*1的卷积核(1*1*16)遍历上述得到32个特征图。则参数量为:(3*3*1+1)*16 + (1*1*16+1)*32=706个。