深度学习中卷积层中多个feature map 的计算 是怎么计算的

Google 深度学习笔记 卷积神经网络 - 博客频道 - CSDN.NET
梦里风林的专栏
https://ahangchen.gitbooks.io/windy-afternoon/content/
分类:机器学习
Convolutional Networks
转载请注明作者:
Github工程地址:
欢迎star,有问题可以到讨论
deep dive into images and convolutional models
BackGround
人眼在识别图像时,往往从局部到全局
局部与局部之间联系往往不太紧密
我们不需要神经网络中的每个结点都掌握全局的知识,因此可以从这里减少需要学习的参数数量
Weight share
但这样参数其实还是挺多的,所以有了另一种方法:权值共享
Share Parameters across space
取图片的一小块,在上面做神经网络分析,会得到一些预测
将切片做好的神经网络作用于图片的每个区域,得到一系列输出
可以增加切片个数提取更多特征
在这个过程中,梯度的计算跟之前是一样的
Patch/Kernel:一个局部切片
Depth: 数据的深度,图像数据是三维的,长宽和RGB,神经网络的预测输出也属于一维
Feature Map:每层Conv网络,因为它们将前一层的feature映射到后一层(Output map)
Stride: 移动切片的步长,影响取样的数量
在边缘上的取样影响Conv层的面积,由于移动步长不一定能整除整张图的像素宽度,不越过边缘取样会得到Valid Padding, 越过边缘取样会得到Same Padding
用一个3x3的网格在一个28x28的图像上做切片并移动
移动到边缘上的时候,如果不超出边缘,3x3的中心就到不了边界
因此得到的内容就会缺乏边界的一圈像素点,只能得到26x26的结果
而可以越过边界的情况下,就可以让3x3的中心到达边界的像素点
超出部分的矩阵补零就行
Deep Convnet
在Convnet上套Convnet,就可以一层一层综合局部得到的信息
将一个deep and narrow的feature层作为输入,传给一个Regular神经网络
Optimization
将不同Stride的卷积用某种方式合并起来,节省卷积层的空间复杂度。
Max Pooling
在一个卷积层的输出层上取一个切片,取其中最大值代表这个切片
不增加需要调整的参数
通常比其他方法准确
缺点:更多Hyper Parameter,包括要取最值的切片大小,以及去切片的步长
LENET-5, ALEXNET
Average Pooling
在卷积层输出中,取切片,取平均值代表这个切片
1x1 Convolutions
在一个卷积层的输出层上,加一个1x1的卷积层,这样就形成了一个小型的神经网络。
- cheap for deeper model
- 结合Average Pooling食用效果更加
对同一个卷积层输出,执行各种二次计算,将各种结果堆叠到新输出的depth方向上
TensorFlow卷积神经网络实践
dataset处理成四维的,label仍然作为one-hot encoding
def reformat(dataset, labels, image_size, num_labels, num_channels):
dataset = dataset.reshape(
(-1, image_size, image_size, num_channels)).astype(np.float32)
labels = (np.arange(num_labels) == labels[:, None]).astype(np.float32)
return dataset, labels
将lesson2的dnn转为cnn很简单,只要把WX+b改为conv2d(X)+b即可
关键在于conv2d
tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, data_format=None, name=None)
给定四维的input和filter tensor,计算一个二维卷积
input: A Tensor. type必须是以下几种类型之一: half, float32, float64.
filter: A Tensor. type和input必须相同
strides: A list of ints.一维,长度4, 在input上切片采样时,每个方向上的滑窗步长,必须和format指定的维度同阶
padding: A string from: "SAME", "VALID". padding 算法的类型
use_cudnn_on_gpu: An optional bool. Defaults to True.
data_format: An optional string from: "NHWC", "NCHW", 默认为"NHWC"。
指定输入输出数据格式,默认格式为”NHWC”, 数据按这样的顺序存储:
[batch, in_height, in_width, in_channels]
也可以用这种方式:”NCHW”, 数据按这样的顺序存储:
[batch, in_channels, in_height, in_width]
name: 操作名,可选.
A Tensor. type与input相同
Given an input tensor of shape [batch, in_height, in_width, in_channels]
and a filter / kernel tensor of shape
[filter_height, filter_width, in_channels, out_channels]
conv2d实际上执行了以下操作:
将filter转为二维矩阵,shape为
[filter_height * filter_width * in_channels, output_channels].
从input tensor中提取image patches,每个patch是一个virtual tensor,shape[batch, out_height, out_width,
filter_height * filter_width * in_channels].
将每个filter矩阵和image patch向量相乘
具体来讲,当data_format为NHWC时:
output[b, i, j, k] =
sum_{di, dj, q} input[b, strides[1] * i + di, strides[2] * j + dj, q] *
filter[di, dj, q, k]
input 中的每个patch都作用于filter,每个patch都能获得其他patch对filter的训练
需要满足strides[0] = strides[3] = 1.
大多数水平步长和垂直步长相同的情况下:strides = [1, stride, stride, 1].
然后再接一个WX+b连Relu连WX+b的全连接神经网络即可
Max Pooling
在tf.nn.conv2d后面接tf.nn.max_pool,将卷积层输出减小,从而减少要调整的参数
tf.nn.max_pool(value, ksize, strides, padding, data_format='NHWC', name=None)
Performs the max pooling on the input.
value: A 4-D Tensor with shape [batch, height, width, channels] and
type tf.float32.
ksize: A list of ints that has length &= 4.
要执行取最值的切片在各个维度上的尺寸
strides: A list of ints that has length &= 4.
取切片的步长
padding: A string, either 'VALID' or 'SAME'. padding算法
data_format: A string. ‘NHWC’ and ‘NCHW’ are supported.
name: 操作名,可选
A Tensor with type tf.float32.
The max pooled output tensor.
仿照lesson2,添加learning rate decay 和 drop out,可以将准确率提高到90.6%
觉得我的文章对您有帮助的话,给个可好?
排名:千里之外
(7)(2)(1)(15)(2)(12)同一个卷积层中的 Feature Map有什么区别?
在深度学习中用卷积神经网络进行特征提取,一般都会设计多个Feature Map,请问它们之间的区别与联系是什么?设计多少个Feature Map是通过什么来判断的?
按时间排序
一本字典里有N多个字,一本词典里有N多个词,一本句典里……有句典吗……在字那一层,它就是一遍一遍地看,有这个字吗有那个字吗,在哪个位置。再上一层就再一遍一遍地看,有这个词吗有那个词吗,在哪里。换成图像,字典有如边缘特征等等底层特征,在底层很难表达,直接用上面的比较概念的的层看吧:轮子特征去卷一遍,出来的图就是有轮子的地方会被激活(显示出来就是灰度高些咯),车牌特征、车窗特征等等亦如此。说得这么通俗,老妇都能理解了吧
多个Feature Map的作用是什么?说一下个人理解,欢迎指正。===================在卷积神经网络中,我们希望用一个网络模拟视觉通路的特性,分层的概念是自底向上构造简单到复杂的神经元。楼主关心的是同一层,那就说说同一层。我们希望构造一组基,这组基能够形成对于一个事物完备的描述,例如描述一个人时我们通过描述身高/体重/相貌等,在卷积网中也是如此。在同一层,我们希望得到对于一张图片多种角度的描述,具体来讲就是用多种不同的卷积核对图像进行卷,得到不同核(这里的核可以理解为描述)上的响应,作为图像的特征。他们的联系在于形成图像在同一层次不同基上的描述。下层的核主要是一些简单的边缘检测器(也可以理解为生理学上的simple cell)。在这里给出部分第一层的结果,盗图来自上层的核主要是一些简单核的叠加(或者用其他词更贴切),可以理解为complex cell。多少个Feature Map?真的不好说,简单问题少,复杂问题多,但是自底向上一般是核的数量在逐渐变多(当然也有例外,如Alexnet),主要靠经验。
尝试结合神经科学对第一个问题简单说说自己的理解,轻黑。在CNN的设定里,Feature Map是卷积核卷出来的,而不同的特征提取(核)会提取不同的feature,模型想要达成的目的是解一个最优化,来找到能解释现象的最佳的一组卷积核。例如某个核如果形似gabor算子,就会提取出边缘信息的feature,但这个特征too simple,很可能不是模型需要的特征。这与人脑神经网络(暂且这么叫吧)的功能是很相似的,比如gabor算子模拟了V1具有方向选择性的神经元,这些神经元被称为simple cell,只能对orientation做出响应,人脑依靠这些神经元检测出图像的边缘信息。但simple cell的功能也仅此而已,人脑若要完成一些更高级的功能(visual attention, object recognition),就需要更复杂的神经元,例如complex cell和hypercomplex cell,它们能对信号做一些更复杂的变换,而恰恰神经科学的证据表明,它们“很可能”是由V1的多个simple cell的输出信号组合而成的,比如V4的一些cell可能对angle做出响应等;考虑一个object recognition的任务,object自身具有不同的特征,不同的复杂的cell编码了其不同的特征,组合起来表达这样一种object。CNN的设定中的feature map也就对应了各层cell的信号输出。参考:关于simple cell, complex cell, hypercomplex cell对不同特征的响应
1.合作关系,具体不知道。会有很多事后诸葛亮的解释,然而并没有什么卵用。2.试
已有帐号?
无法登录?
社交帐号登录4409人阅读
深度学习 Deep Learning(14)
欢迎转载,转载请注明:本文出自。
技术交流QQ群:,欢迎对算法、技术感兴趣的同学加入。
关于卷积神经网络CNN,网络和文献中有非常多的资料,我在工作/研究中也用了好一段时间各种常见的model了,就想着简单整理一下,以备查阅之需。如果读者是初接触CNN,建议可以先看一看“Deep Learning(深度学习)学习笔记整理系列”中关于CNN的介绍[1],是介绍我们常说的Lenet为例,相信会对初学者有帮助。
Lenet,1986年
Alexnet,2012年
GoogleNet,2014年
VGG,2014年
Deep Residual Learning,2015年
就从Lenet说起,可以看下,可以试着理解每一层的大小,和各种参数。由两个卷积层,两个池化层,以及两个全连接层组成。 卷积都是5*5的模板,stride=1,池化都是MAX。下图是一个类似的结构,可以帮助理解层次结构(和caffe不完全一致,不过基本上差不多)
2012年,Imagenet比赛冠军的model——Alexnet
[2](以第一作者alex命名)。。说实话,这个model的意义比后面那些model都大很多,首先它证明了CNN在复杂模型下的有效性,然后GPU实现使得训练在可接受的时间范围内得到结果,确实让CNN和GPU都大火了一把,顺便推动了有监督DL的发展。
模型结构见下图,别看只有寥寥八层(不算input层),但是它有60M以上的参数总量,事实上在参数量上比后面的网络都大。
这个图有点点特殊的地方是卷积部分都是画成上下两块,意思是说吧这一层计算出来的feature map分开,但是前一层用到的数据要看连接的虚线,如图中input层之后的第一层第二层之间的虚线是分开的,是说二层上面的128map是由一层上面的48map计算的,下面同理;而第三层前面的虚线是完全交叉的,就是说每一个192map都是由前面的128+128=256map同时计算得到的。
Alexnet有一个特殊的计算层,LRN层,做的事是对当前层的输出结果做平滑处理。下面是我画的示意图:
前后几层(对应位置的点)对中间这一层做一下平滑约束,计算方法是:
具体打开Alexnet的每一阶段(含一次卷积主要计算)来看[2][3]:
- relu - pooling - LRN
具体计算都在图里面写了,要注意的是input层是227*227,而不是paper里面的224*224,这里可以算一下,主要是227可以整除后面的conv1计算,224不整除。如果一定要用224可以通过自动补边实现,不过在input就补边感觉没有意义,补得也是0。
(2)conv - relu - pool - LRN
和上面基本一样,唯独需要注意的是group=2,这个属性强行把前面结果的feature map分开,卷积部分分成两部分做。
(3)conv - relu
(4)conv-relu
(5)conv - relu - pool
(6)fc - relu - dropout
这里有一层特殊的dropout层,在alexnet中是说在训练的以1/2概率使得隐藏层的某些neuron的输出为0,这样就丢到了一半节点的输出,BP的时候也不更新这些节点。
fc - relu - dropout
(8)fc - softmax
以上图借用[3],感谢。
googlenet[4][5],14年比赛冠军的model,这个model证明了一件事:用更多的卷积,更深的层次可以得到更好的结构。(当然,它并没有证明浅的层次不能达到这样的效果)
这个model基本上构成部件和alexnet差不多,不过中间有好几个inception的结构:
是说一分四,然后做一些不同大小的卷积,之后再堆叠feature map。
计算量如下图,可以看到参数总量并不大,但是计算次数是非常大的。
VGG有很多个版本,也算是比较稳定和经典的model。它的特点也是连续conv多,计算量巨大(比前面几个都大很多)。具体的model结构可以参考[6],这里给一个简图。基本上组成构建就是前面alexnet用到的。
下面是几个model的具体结构,可以查阅,很容易看懂。
Deep Residual Learning
这个model是2015年底最新给出的,也是15年的imagenet比赛冠军。可以说是进一步将conv进行到底,其特殊之处在于设计了“bottleneck”形式的block(有跨越几层的直连)。最深的model采用的152层!!下面是一个34层的例子,更深的model见表格。
其实这个model构成上更加简单,连LRN这样的layer都没有了。
block的构成见下图:
OK,到这里把常见的最新的几个model都介绍完了,可以看到,目前cnn model的设计思路基本上朝着深度的网络以及更多的卷积计算方向发展。虽然有点暴力,但是效果上确实是提升了。当然,我认为以后会出现更优秀的model,方向应该不是更深,而是简化。是时候动一动卷积计算的形式了。
[2] ImageNet Classification with Deep Convolutional Neural Networks
[5] Going deeper with convolutions
[6] VERY DEEP CONVOLUTIONAL NETWORKS FOR LARGE-SCALE IMAGE RECOGNITION
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:94341次
积分:1424
积分:1424
排名:千里之外
原创:42篇
转载:18篇
评论:26条
关注机器学习、深度学习算法,高性能硬件加速;
(7)(5)(2)(2)(1)(5)(4)(3)(7)(7)(1)(2)(6)(1)(1)(4)(1)&&国之画&&&&&&
版权所有 京ICP备号-2
迷上了代码!}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信