1x1卷积核如何降低参数量

本文介绍1*1的卷积核与googlenet里面的Inception。正式介绍之前,首先回顾卷积网络的基本概念。 
1. 卷积核:可以看作对某个局部的加权求和;它是对应局部感知,它的原理是在观察某个物体时我们既不能观察每个像素也不能一次观察整体,而是先从局部开始认识,这就对应了卷积。卷积核的大小一般有1x1,3x3和5x5的尺寸。卷积核的个数就对应输出的通道数,这里需要说明的是对于输入的每个通道,输出每个通道上的卷积核是不一样的。比如输入是28x28x192(WxDxK,K代表通道数),然后在3x3的卷积核,卷积通道数为128,那么卷积的参数有3x3x192x128,其中前两个对应的每个卷积里面的参数,后两个对应的卷积总的个数。 
2. 池化(pooling):卷积特征往往对应某个局部的特征。要得到globa的特征需要将全局的特征就行一个aggregation。池化就是这样一个操作,对于每个卷积通道,将更大尺寸(甚至是globa)上的卷积特征进行pooling就可以得到更有全局性的特征。这里的pooling当然就对应了cross region。与1x1的卷积相对应,后者可以看作一个cross channel的pooling操作。pooling的另外一个作用就是升维或者降维,后面我们可以看到1x1的卷积也有相似的作用。

下面从一般卷积过程介绍1x1的卷积,借用[1]中的图来表示卷积的过程: 
convolution 
对于nxn(n>1)的卷积核,我们通常还要考虑pad(边缘补0的个数),stride(每次卷积移动的步长)。但是当尺寸是1x1时,对于single channel而言就相当于对原特征的Scala操作;但是我们一般遇到的都是multi-channel的情况,此时我们便可以根据自己的需要定义卷积核的个数,从而进行降(升)维。如上面所说,如果将它看作cross channel的pooling 操作,它还能帮我们得到在同一位置不同通道之间进行特征的aggregation。 
总结一下,1x1的卷积核可以进行降维或者升维,也就是通过控制卷积核(通道数)实现,这个可以帮助减少模型参数,也可以对不同特征进行尺寸的归一化;同时也可以用于不同channel上特征的融合。一个trick就是在降维的时候考虑结合传统的降维方式,如PCA的特征向量实现,这样效果也可以得到保证。 
以googlenet[3]中的inception模块为例,来说明1x1的卷积如何来减少模型参数。 
inception
左边是naive的inception模块,右边是加入1x1 convolution进行降维的inception。按照上面的说法,我们的这层的模型参数与输入的特征维数(28x28x192),卷积核大小以及卷积通道数(包括三种卷积核,分别是1x1x64,3x3x128,5x5x32),右图中在3x3,5x5 convolution前新加入的1x1的卷积核为96和16通道的,在max pooling后加入的1x1卷积为32通道。那么图a该层的参数为(1x1x192x64)+(3x3x192x128)+(5x5x192x32) 
图b该层的参数为(1x1x192x64)+(1x1x192x96)+(1x1x192x16)+(3x3x96x128)+(5x5x16x32)+(1x1x192x32). 
比较可知,模型参数减少了。 
reference 
[1]http://blog.youkuaiyun.com/stdcoutzyx/article/details/41596663 
[2]http://www.caffecn.cn/?/question/136 
[3]going deeper with convolutions


来源:http://blog.youkuaiyun.com/Touch_Dream/article/details/77072893

### 1x1 卷积神经网络减少通道数技术 在卷积神经网络 (CNN) 中,1x1 卷积层被广泛应用于调整特征图的深度(即通道数量)。通过应用较少数量的滤波器,可以有效地降低输入特征图的维度。例如,在处理一个尺寸为 \(200 \times 200\) 的图像并拥有 50 个特征的情况下,如果使用 20 个 1x1 的过滤器,则输出将会变成 \(200 \times 200 \times 20\)[^3]。 这种操作不仅能够简化模型结构,还能显著减少参数量和计算成本。具体来说,当采用 1x1 卷积来替代全连接层时,可以在保持性能的同时大幅削减复杂度[^2]。此外,由于其轻量化特性,这种方法特别适合于资源受限环境下的部署场景。 下面是一个简单的 Python 实现例子: ```python import tensorflow as tf def apply_1x1_conv(input_tensor, output_channels): """ 应用 1x1 卷积以改变给定张量 input_tensor 的通道数目至 output_channels. 参数: input_tensor: 输入张量, 形状为 [batch_size, height, width, in_channels]. output_channels: 输出所需的通道数. 返回: 经过 1x1 卷积后的张量. """ # 定义 1x1 卷积核权重变量 kernel = tf.Variable(tf.random.truncated_normal([1, 1, int(input_tensor.shape[-1]), output_channels])) # 执行 1x1 卷积操作 conv_output = tf.nn.conv2d(input=input_tensor, filters=kernel, strides=[1, 1, 1, 1], padding='SAME') return conv_output ``` 此函数接收任意大小的四维张量作为输入,并返回经过 1x1 卷积变换后的新张量,其中最后一个维度代表新的通道数。这使得开发者可以根据实际需求灵活控制中间表示的空间分辨率以及最终预测结果的质量。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值