【深度学习】卷积神经网络中用1*1 卷积有什么作用或者好处呢?

本文转自:AI遇见机器学习
地址:https://www.zhihu.com/question/56024942
编辑:机器学习算法与自然语言处理
作者:陈运锦
个人的几点理解:
https://zhuanlan.zhihu.com/p/35814486
目录:
part I   :来源
part II  :应用
part III :作用(降维、升维、跨通道交互、增加非线性)
part IV :从fully-connected layers的角度理解
一、来源:[1312.4400] Network In Network (如果1×1卷积核接在普通的卷积层后面,配合激活函数,即可实现network in network的结构)
二、应用:GoogleNet中的Inception、ResNet中的残差模块
三、作用:
1、降维(减少参数)
例子1 : GoogleNet中的3a模块
输入的feature map是28×28×192
1×1卷积通道为64
3×3卷积通道为128
5×5卷积通道为32
左图卷积核参数:192 × (1×1×64) +192 × (3×3×128) + 192 × (5×5×32) = 387072
右图对3×3和5×5卷积层前分别加入了通道数为96和16的1×1卷积层,这样卷积核参数就变成了:
192 × (1×1×64) +(192×1×1×96+ 96 × 3×3×128)+(192×1×1×16+16×5×5×32)= 157184
同时在并行pooling层后面加入1×1卷积层后也可以降低输出的feature map数量(feature map尺寸指W、H是共享权值的sliding window,feature map 的数量就是channels)
左图feature map数量:64 + 128 + 32 + 192(pooling后feature map不变) = 416 (如果每个模块都这样,网络的输出会越来越大)
右图feature map数量:64 + 128 + 32 + 32(pooling后面加了通道为32的1×1卷积) = 256
GoogLeNet利用1×1的卷积降维后,得到了更为紧凑的网络结构,虽然总共有22层,但是参数数量却只是8层的AlexNet的十二分之一(当然也有很大一部分原因是去掉了全连接层)
例子2:ResNet中的残差模块
假设上一层的feature map是w*h*256,并且最后要输出的是256个feature map
左侧操作数:w*h*256*3*3*256 =589824*w*h
右侧操作数:w*h*256*1*1*64 + w*h*64*3*3*64 +w*h*64*1*1*256 = 69632*w*h,,左侧参数大概是右侧的8.5倍。(实现降维,减少参数)
2、升维(用最少的参数拓宽网络channal)
例子:上一个例子中,不仅在输入处有一个1*1卷积核,在输出处也有一个卷积核,3*3,64的卷积核的channel是64,只需添加一个1*1,256的卷积核,只用64*256个参数就能把网络channel从64拓宽四倍到256。
3、跨通道信息交互(channal 的变换)
例子:使用1*1卷积核,实现降维和升维的操作其实就是channel间信息的线性组合变化,3*3,64channels的卷积核后面添加一个1*1,28channels的卷积核,就变成了3*3,28channels的卷积核,原来的64个channels就可以理解为跨通道线性组合变成了28channels,这就是通道间的信息交互。
注意:只是在channel维度上做线性组合,W和H上是共享权值的sliding window
4、增加非线性特性
1*1卷积核,可以在保持feature map尺度不变的(即不损失分辨率)的前提下大幅增加非线性特性(利用后接的非线性激活函数),把网络做的很deep。
备注:一个filter对应卷积后得到一个feature map,不同的filter(不同的weight和bias),卷积以后得到不同的feature map,提取不同的特征,得到对应的specialized neuro。
四、从fully-connected layers的角度来理解1*1卷积核
将其看成全连接层
左边6个神经元,分别是a1—a6,通过全连接之后变成5个,分别是b1—b5
左边6个神经元相当于输入特征里面的channels:6
右边5个神经元相当于1*1卷积之后的新的特征channels:5
左边 W*H*6 经过 1*1*5的卷积核就能实现全连接。
In Convolutional Nets, there is no such thing as “fully-connected layers”. There are only convolution layers with 1x1 convolution kernels and a full connection table– Yann LeCun
参考:https://iamaaditya.github.io/2016/03/one-by-one-convolution/

本文仅做学术分享,如有侵权,请联系删文。

 
 

5b0acf521206e86658e179e2b5570d23.jpeg

 
 
 
 
 
 
 
 
往期精彩回顾




适合初学者入门人工智能的路线及资料下载(图文+视频)机器学习入门系列下载机器学习及深度学习笔记等资料打印《统计学习方法》的代码复现专辑机器学习交流qq群955171419,加入微信群请扫码
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用卷积神经网络恢复segy地震数据的MATLAB代码示例: ```matlab % 加载segy数据 data = ReadSegy('data.segy'); % 数据预处理 % 将数据归一化到[-1,1]范围内 data = data/max(abs(data(:))); % 将数据reshape成二维矩阵,每行为一个trace [n1, n2, n3] = size(data); data = reshape(data, n1*n2, n3); % 划分训练集和测试集 train_data = data(:, 1:800); % 前800个trace作为训练集 test_data = data(:, 801:end); % 后面的trace作为测试集 % 构造卷积神经网络模型 layers = [ imageInputLayer([n1,n2,1]) convolution2dLayer(5,64,'Padding','same') reluLayer convolution2dLayer(5,32,'Padding','same') reluLayer convolution2dLayer(5,1,'Padding','same') regressionLayer ]; options = trainingOptions('adam','MaxEpochs',10,'MiniBatchSize',32); % 训练卷积神经网络模型 net = trainNetwork(reshape(train_data,[n1,n2,1,800]),reshape(train_data,[n1,n2,1,800]),layers,options); % 对测试集进行预测 pred_data = predict(net, reshape(test_data,[n1,n2,1,size(test_data,2)])); % 将预测结果reshape成三维矩阵 pred_data = reshape(pred_data, n1, n2, size(test_data,2)); % 将预测结果保存为segy文件 WriteSegy('pred_data.segy', pred_data, 1, 1, 1, 1); ``` 这个示例代码使用了卷积神经网络模型来恢复segy地震数据。首先将数据进行预处理,然后将数据reshape成二维矩阵。接着划分训练集和测试集,使用MATLAB的深度学习工具箱中的卷积神经网络模型来训练模型。最后对测试集进行预测,将预测结果reshape成三维矩阵,并保存为segy文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值