卷积到底是如何操作的?1x1卷积?参数如何计算?

本文深入解析卷积操作的核心机制,包括单个与多个特征图和滤波器的运算方式,滤波器参数的计算方法,以及滤波器的特性。此外,文章详细阐述了1x1卷积核在模型压缩中的应用,通过实例展示其如何减少参数和运算量而不牺牲网络性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

卷积到底是如何操作的

filter的参数如何计算

卷积的特性

1x1的卷积核



卷积到底是如何操作的

  • 1. 对于一个特征图(如灰度图)             

 

卷积就是对应元素乘积的求和,然后在加上一个非线性函数。

但是上面的例子只有一个输入channel和一个卷积核,当有很多channel和多个卷积核时,又改如何计算呢?


  • 2. 多个特征图如何和多个filter进行运算呢?

先来看动图,这里有三个输入维度,两个卷积核,最后输出的是两个特征图。

Remember:一个filter就是一个特征,一般会有多个卷积核(也就是多个channel),所以,一个filter更多的时候是一个长方体,而不是一个平面,为什么会这样呢?

因为,并不是每个特征图和每个卷积核去匹配的,而是所有的输入channel同时和一个filter做运算,也就是多个卷积核的对应元素乘积的求和。因此对于一个filter,它应该具有和原图相同的channel 。如原图是3通道的,那么filter也应该是3通道 ​。当然filter的channel的参数不需要人为设置,因为它就是输入层的channel数,但计算时需要考虑。

 

  • 单个filter  -- 含有多个特征图(可看做彩色图片的三个通道)

上图看起来有三个filter,其实就是一个一个含有三个channel的filter

  • 多个filter

上图中有两个 filter,也就是两个特征,每个含有三个channel,所以最后会输出两个特征图。

 


filter的参数如何计算

 

以VGG16的 block1_conv1为例,卷积核是3x3(大家肯定都知道),filter的个数是64,也就是说会输出64个特征图。filter的输入维度是3,因此参数的个数应该是    (3x3x3+1)x64 = 1792

前面3x3表示一个channel的参数数目,后面的3指的是输入层的channel,加1表示每个filter含有偏置

 

再举个例子:请看block2_conv1 它的参数应该是(3x3x64+1)x128 = 73856

In [2]:
from keras.applications.vgg16 import VGG16

In [4]:
model = VGG16()
In [5]:

model.summary()
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_1 (InputLayer)         (None, 224, 224, 3)       0         
_________________________________________________________________
block1_conv1 (Conv2D)        (None, 224, 224, 64)      1792      
_________________________________________________________________
block1_conv2 (Conv2D)        (None, 224, 224, 64)      36928     
_________________________________________________________________
block1_pool (MaxPooling2D)   (None, 112, 112, 64)      0         
_________________________________________________________________
block2_conv1 (Conv2D)        (None, 112, 112, 128)     73856     
_________________________________________________________________
block2_conv2 (Conv2D)        (None, 112, 112, 128)     147584    
_________________________________________________________________
block2_pool (MaxPooling2D)   (None, 56, 56, 128)       0         
_________________________________________________________________
block3_conv1 (Conv2D)        (None, 56, 56, 256)       295168    
_________________________________________________________________
block3_conv2 (Conv2D)        (None, 56, 56, 256)       590080    
_________________________________________________________________
block3_conv3 (Conv2D)        (None, 56, 56, 256)       590080    
_________________________________________________________________
block3_pool (MaxPooling2D)   (None, 28, 28, 256)       0         
_________________________________________________________________
block4_conv1 (Conv2D)        (None, 28, 28, 512)       1180160   
_________________________________________________________________
block4_conv2 (Conv2D)        (None, 28, 28, 512)       2359808   
_________________________________________________________________
block4_conv3 (Conv2D)        (None, 28, 28, 512)       2359808   
_________________________________________________________________
block4_pool (MaxPooling2D)   (None, 14, 14, 512)       0         
_________________________________________________________________
block5_conv1 (Conv2D)        (None, 14, 14, 512)       2359808   
_________________________________________________________________
block5_conv2 (Conv2D)        (None, 14, 14, 512)       2359808   
_________________________________________________________________
block5_conv3 (Conv2D)        (None, 14, 14, 512)       2359808   
_________________________________________________________________
block5_pool (MaxPooling2D)   (None, 7, 7, 512)         0         
_________________________________________________________________
flatten (Flatten)            (None, 25088)             0         
_________________________________________________________________
fc1 (Dense)                  (None, 4096)              102764544 
_________________________________________________________________
fc2 (Dense)                  (None, 4096)              16781312  
_________________________________________________________________
predictions (Dense)          (None, 1000)              4097000   
=================================================================
Total params: 138,357,544
Trainable params: 138,357,544
Non-trainable params: 0
_________________________________________________________________

​
  • 卷积的特性

  • 1. 卷积的参数为甚这么少

    • 权值共享
      因为一个特征检测如垂直边缘检测,如果适用于图片的某个区域,一定也适用于其他区域

    • 稀疏连接
      对于每个layer,它的输出值之和很少的输入数据有关,如红色圆圈的数值之和原图中的3x3的大小的数据有关。

  • 2.为啥具有平移不变性

     由于卷积的结构,即使移动几个像素值,仍然具有相似的特征。


 

1x1的卷积核

这是最简单的1x1卷积,这时候输出channel是filter的channel都是1,这时候只是乘以一个倍数,显然没什么作用,继续看

现在输出channel是32,此时才能发挥它的作用。

上文说过,filter的channel必须和输入的channel相等,因此,这个1x1的filter 的channel也是32

操作:这个黄色的1x1的filter,先与蓝色长方体的左上角的一个1x1x32的长方体,对应元素相乘,求和,然后在加一个非线性运算,如Relu,就得了右图的一个数据点。然后依次遍历所有的位置,就生成了一张6x6的特征图。

这只是一个filter,当有n的1x1的filter时,就会有n个特征图。

因此,有没有发现,1x1的卷积核,并不改变图像的高宽,但可以改变模型的维度。因此也可以用于模型压缩,继续往后看。

  • 1x1的卷积如何实现模型压缩?

举个栗子:我们希望实现,从28x28x192 到28x28x32的转换

如果用5x5卷积的话,通过padding可以实现图片尺寸不变

此时的参数个数为:(5x5x32 + 1)x 192 = 153792

但是如果,你在中间加上一层1x1的卷积,先把输入的维度,降下来,在用5x5的卷积时,参数个数会怎么样呢?

参数:(1x1x16+ 1)x192 + (5x5x32 + 1)x16 = 16080,仅仅是原来的十分之一,特别当维度很高时,参数的减少越明显。

中间的这层,也被称为瓶颈层,bottleneck layer

大家可能会问,把维度参数降低了这么多,维度也从192到了16,网络结构性能不会下降吗?

既然现在1x1的卷积被广泛的应用,也就说明只要合理构建bottleneck layer ,既可以减少参数,运算量,也不会降低网络性能​​

1x1的卷积的典型应用,请去看inception系列的网络结构。建议去看吴恩达 Andrew Ng的网易云课程

<think>我们首先计算卷积层的参数量,然后计算全连接层的参数量。1.卷积参数计算:假设我们有一个卷积核,其大小为KxK,输入通道数为C_in,输出通道数为C_out(即使用C_out个卷积核)。每个卷积核的参数为:K*K*C_in(权重参数)+1(偏置参数,可选)。但通常我们计算时,如果包含偏置,则每个卷积核加1。因此,总的参数量为:C_out*(K*K*C_in+1)或者如果不使用偏置,则为C_out*K*K*C_in。题目中,输入是128维(这里我们可以理解为输入特征图的通道数为128,即C_in=128),输出为1维(即输出通道数为1,C_out=1)。但是,卷积核的大小K没有给定。因此,我们需要假设一个卷积核大小。通常,在1卷积中,我们可能使用1x1卷积(即点卷积)或者3x3等。由于题目没有指定,我们可以考虑两种常见的卷积核:1x1和3x3,但这里题目没有明确是1D卷积还是2D卷积?不过,通常我们说128维可能是指128个通道,而空间维度可能是1(比如时间序列)或2(图像)。为了通用性,我们考虑2D卷积(因为1D卷积可以看作2D卷积中高度为1的情况)。但题目要求输出1维,这里可能是指输出通道数为1。假设我们使用KxK的卷积核(例如3x3),那么:卷积参数量=输出通道数*(卷积核宽*卷积核高*输入通道数+1)=1*(3*3*128+1)=1*(1152+1)=1153如果使用1x1卷积核,则:1*(1*1*128+1)=129。2.全连接层参数计算:全连接层的输入是一个向量,输出是另一个向量。输入维度为128,输出维度为1参数量=(输入维度)*(输出维度)+(输出维度)[偏置]=128*1+1=129。因此,对比:当卷积核为1x1时,卷积参数量为129,与全连接层相同。当卷积核为3x3时,卷积参数量为1153,大于全连接层。但是,这里有一个关键点:卷积层的输入通常是一个三维张量(C,H,W),而全连接层输入是一维向量。如果我们将128维理解为128个特征,那么全连接层就是直接映射。而卷积层则是在空间上共享权重,所以即使输入是128通道,它也会在空间维度上滑动。然而,题目中“128维输出1维”可能是指输入特征向量长度为128,输出为1。在这种情况下,全连接层就是129个参数。但是,如果输入是128维的特征向量,我们通常不会用卷积(除非我们将其重塑为2D形式,比如1x128的图像,然后使用卷积核在高度为1,宽度上进行卷积)。这时,如果我们使用宽度为K的卷积核(相当于1D卷积卷积核大小为1xK),输入通道数为1(因为现在是一个通道,但特征向量长度为128),输出通道数为1,那么:卷积层(1D卷积):假设卷积核宽度为K,那么每个卷积参数:K*1(输入通道数)+1(偏置)=K+1。注意:这里输入通道数为1,因为我们把128维向量看作1个通道,长度为128的特征图。但是,我们想要输出1维(即一个值),那么卷积核的宽度必须为128(即覆盖整个输入),这样输出就是1个值(因为步长为1,不填充的话,输出长度为1)。所以K=128。因此,参数量=1*(128*1+1)=129。或者,我们也可以使用多个卷积核,但题目要求输出1维,所以我们只需要一个卷积核,且该卷积核覆盖整个输入。结论:在输入为128维向量,输出为1维向量的情况下:-全连接层:129个参数。-卷积层(使用1D卷积卷积核大小为128,且不使用填充,步长任意(但要保证输出为1)):129个参数(包括偏置)。然而,通常情况下,我们不会使用覆盖整个输入的卷积核(因为这样就和全连接一样了,而且失去了局部连接和权值共享的特性)。所以,实际中,我们可能使用较小的卷积核,然后通过全连接层或者全局池化来降到1维。但题目没有说明卷积核的大小,所以我们需要明确:如果卷积核大小等于输入长度(在1D情况下),那么卷积层的参数量与全连接层相同(129)。如果卷积核小于输入长度,那么卷积参数量会小于全连接层(因为权值共享),但输出可能不是1维(需要多次卷积或者池化等操作来降维)。为了回答题目,我们假设两种情况:情况1:输入是一个128维的向量(即1x128),输出要求一个值(1维)。-全连接层:129个参数。-卷积层:如果我们使用一个卷积核,其大小为128(即1x128),那么参数为:128(权重)+1(偏置)=129。所以相同。情况2:输入是一个128通道的特征图(比如在图像中,空间尺寸为HxW),输出要求1通道的特征图(空间尺寸可能不变,也可能改变,但题目要求输出1维,这里可能是指输出通道数为1,而空间尺寸保持不变?)-全连接层:如果我们要将整个输入(包括所有空间位置)映射到1个值,那么全连接层的输入节点数为128*H*W,输出为1参数量为(128*H*W)*1+1,这个数量巨大(取决于H和W)。-卷积层:使用1x1卷积,输出通道数为1参数量为128*1*1+1=129(因为1x1卷积不改变空间尺寸,但将通道数从128变为1)。或者使用3x3卷积,则参数量为3*3*128+1=1153。题目中的“128维输出1维”可能是指通道数的变化(从128个通道变为1个通道),而空间尺寸不变。那么:-卷积层(1x1卷积):129个参数。-卷积层(3x3卷积):1153个参数。-全连接层:如果空间尺寸很大,全连接层参数会非常多(因为全连接层会忽略空间结构,将每个空间位置和每个通道都连接,输入节点数为128*H*W,输出为1参数128*H*W+1)。所以在这种情况下,使用卷积层(尤其是1x1卷积)可以大大减少参数。总结:题目没有明确输入数据的结构(是向量还是多通道特征图)以及卷积核的大小,所以我们需要根据常见情况给出答案。通常,在深度学习中,当我们说“128维”时,如果是特征向量,那么全连接层参数129;如果是特征图(比如128个通道),那么卷积层(1x1参数129,全连接层参数巨大(不推荐)。因此,我们给出两种解释:解释1:输入是128维向量(即长度为128的向量),输出1维(一个数)。全连接层参数量:128*1+1=129卷积层:使用1D卷积卷积核大小128,输出1个值,参数量:128+1=129解释2:输入是128通道的特征图(不考虑空间尺寸),输出1通道的特征图(即通道数从128变为1)。卷积层(1x1卷积):128*1*1+1=129卷积层(3x3卷积):128*3*3+1=1153全连接层:不适用,因为全连接层需要固定输入大小,而且会破坏空间结构。但如果我们强行将整个特征图展平,那么输入节点数为128*H*W,输出节点数为1(整个特征图输出一个值),则参数量为128*H*W+1,这个值很大。由于题目没有明确,我们通常更倾向于解释为通道数的变化(即解释2),因为128维在深度学习中常表示通道数。但题目说“输出1维”,在卷积网络中,输出1通道的特征图,空间尺寸不变,那么输出特征图的空间尺寸和输入相同,但通道数为1。所以输出并不是一个1维的标量,而是一个特征图(只不过通道数为1)。如果题目要求输出一个标量(1维向量,即一个数),那么可能需要在卷积后接全局池化(比如全局平均池化)来将每个通道变成一个数,然后接全连接层(输入128,输出1)或者直接使用一个卷积核大小为整个空间尺寸的卷积(这样输出空间尺寸为1x1,即一个数)。所以,如果要求输出一个标量(一个数),那么:方法1:使用全局平均池化将每个通道池化成一个数(这样得到128个数),然后接全连接层(128->1),参数量:128*1+1=129方法2:使用一个卷积核,其空间尺寸等于输入特征图的空间尺寸(HxW),这样输出一个通道的一个值(1x1的特征图)。参数量:128*H*W+1(因为卷积核大小为HxW,输入通道128,输出通道1)因此,在这种情况下,全连接层(方法1参数129,而卷积层(方法2)参数128*H*W+1(通常很大)。结论:在不知道输入数据的空间尺寸和卷积核大小的情况下,无法直接比较。但我们可以说:-如果使用1x1卷积将通道数从128变为1,然后使用全局池化得到一个数,那么卷积部分参数129(1x1卷积),池化无参数,所以总参数129。-如果直接使用全连接层将128个通道的全局池化结果(128个数)映射为1个数,也是129个参数。所以,在将128维(通道)降为1维(一个数)的任务中,两种方法(1x1卷积+全局池化+全连接?注意:1x1卷积后得到1个通道的特征图,全局池化后得到1个数,所以不需要全连接层了)的参数量可能相同。但注意:1x1卷积+全局平均池化:-1x1卷积:输入128通道,输出1通道,参数量:128*1*1+1=129-全局平均池化:无参数-输出一个数(标量)而全连接层方法:-全局平均池化(每个通道池化得到一个数,128个通道得到128个数)无参数-全连接层:128->1参数129所以两种方法参数都是129。但是,如果直接使用一个卷积核覆盖整个空间(即方法2),则参数量为128*H*W+1,远大于129。因此,通常我们使用1x1卷积将通道降为1,然后全局池化,或者先全局池化再全连接。这两种方式参数量相同(129)。综上所述,在常见做法中,参数量都是129。但题目中只问“卷积和全连接参数量分别是多少”,没有具体说明结构,所以我们给出一般情况下的计算方式,并举例说明。我们假设输入是一个128通道的2D特征图(空间尺寸为HxW),要求输出一个标量(1维)。方案1卷积方式1):使用1x1卷积将通道降为1,然后全局平均池化。卷积参数量:129(与输入空间尺寸H,W无关)全连接层:无方案2(全连接方式):先全局平均池化得到128个值,然后全连接层(128->1)。卷积层:无全连接层:129方案3(卷积方式2):使用一个卷积核大小为HxW的卷积,输入通道128,输出通道1,然后输出就是一个1x1的特征图(即一个数)。卷积参数量:128*H*W+1所以,卷积参数量可以是129(当使用1x1卷积时)或者128*H*W+1(当使用HxW卷积时),全连接的参数量为129(当使用全连接层将128维向量映射到1维时)。因此,答案需要根据具体结构来确定。由于题目没有提供更多信息,我们只能给出常见的计算方式,并指出在特定情况下(1x1卷积卷积参数量为129,全连接层(128->1参数量也是129。所以,最终回答:-如果使用1x1卷积(将128通道降为1通道)然后全局池化得到一个标量,那么卷积参数量为129。-如果使用全连接层(输入128,输出1),那么参数量为129。-如果使用覆盖整个空间的大卷积核,那么卷积参数量为128*H*W+1(远大于129)。在不知道具体结构的情况下,我们无法给出确切数字,但可以给出计算方式。为了更直观,我们假设输入特征图的空间尺寸为1x1(即相当于输入是一个128维向量),那么:-卷积(使用1x1卷积参数量:128*1*1+1=129-全连接层(128->1):128*1+1=129-卷积(使用1x1卷积)和全连接层参数量相同。如果输入特征图空间尺寸大于1,那么使用1x1卷积参数量仍然是129,而全连接层(如果直接连接整个特征图)参数量巨大。但是,如果我们先全局池化再全连接,则全连接层参数129。因此,在常规操作中(即先全局池化再全连接,或者1x1卷积再全局池化),参数量都是129。所以,我们通常采用的方式参数量为129。结论:在常见的降维操作中(将128通道降为1个标量),卷积1x1)和全连接层(128->1)的参数量都是129。因此,我们可以回答:在常规实现下,参数量均为129。但是,请注意:这里全连接层指的是128个输入节点到1个输出节点的全连接层,而卷积指的是1x1卷积(输出通道为1)的卷积层。如果使用其他卷积核,则参数量会变化。所以,最终答案:在将128维(通道)降为1维(标量)的任务中,使用1x1卷积(然后接全局池化)的卷积参数量为129;使用全连接层(输入128,输出1)的参数量为129。</think>### 卷积层和全连接层参数计算 #### 1. **卷积参数计算** 假设输入通道数为 128,输出通道数为 1卷积核尺寸为 \(K \times K\)(未指定时以常见尺寸 1x1 和 3x3 为例): - **参数公式**: \[ \text{参数量} = (\text{卷积核宽} \times \text{卷积核高} \times \text{输入通道数} + 1) \times \text{输出通道数} \] (其中 `+1` 表示偏置项) - **示例计算**: - **1x1 卷积**: \[ (1 \times 1 \times 128 + 1) \times 1 = 129 \] - **3x3 卷积**: \[ (3 \times 3 \times 128 + 1) \times 1 = 1153 \] - **覆盖全局的卷积**(如空间尺寸 HxW): \[ (H \times W \times 128 + 1) \times 1 = 128HW + 1 \] #### 2. **全连接层参数计算** 假设输入维度为 128,输出维度为 1: - **参数公式**: \[ \text{参数量} = (\text{输入维度} \times \text{输出维度}) + \text{输出维度} \] (其中 `+ 输出维度` 表示偏置项) - **示例计算**: \[ (128 \times 1) + 1 = 129 \] --- ### 关键结论 - **1x1 卷积 vs 全连接层**: 当输入是 **128 维向量**(或 128 通道的 1x1 特征图)时,两者参数量相同(均为 129)。 - **空间维度影响**: 若输入是 **128 通道的 HxW 特征图**: - 1x1 卷积参数量仍为 **129**(与空间尺寸无关)。 - 全连接层直接处理展平后的特征需 \((128 \times H \times W + 1)\) 参数(巨大)。 - 覆盖全局的卷积(如 HxW 卷积核)需 \(128HW + 1\) 参数(通常不实用)。 --- ### 代码验证(Python) ```python def calculate_conv_params(kernel_size, in_channels, out_channels=1): weights = kernel_size * kernel_size * in_channels * out_channels biases = out_channels # 每个输出通道一个偏置 return weights + biases def calculate_fc_params(in_features, out_features=1): weights = in_features * out_features biases = out_features # 每个输出单元一个偏置 return weights + biases # 示例计算 print("1x1 卷积参数量:", calculate_conv_params(1, 128)) # 输出 129 print("3x3 卷积参数量:", calculate_conv_params(3, 128)) # 输出 1153 print("全连接层参数量:", calculate_fc_params(128)) # 输出 129 ``` #### 代码说明: - `calculate_conv_params`:计算卷积参数量,需指定卷积核尺寸、输入/输出通道数。 - `calculate_fc_params`:计算全连接参数量,需指定输入/输出维度。 - 结果验证了 1x1 卷积和全连接层在 128 维输入到 1 维输出时参数相同(129)。 --- ### 常见场景建议 - **降低参数**:用 1x1 卷积替代全连接层处理多通道特征(如将 128 通道降为 1 通道)。 - **输出标量**: 先通过 1x1 卷积压缩通道数,再用全局平均池化生成标量,总参数量仍为 129。 ---
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值