赞
踩
注:下表中的“#3x3 reduce”,“#5x5 reduce”表示在3x3,5x5卷积操作之前使用了1x1卷积的数量。
原始输入图像为224x224x3,且都进行了零均值化的预处理操作(图像每个像素减去均值)。
深度是22层
输入:224x224x3,目标输出:112x112x64
使用7x7的卷积核(滑动步长2,padding为3,SAME),64通道,输出为112x112x64,卷积后进行ReLU操作,
经过最大值池化:使用3x3的卷积核(滑动步长2,padding为1,SAME),输出为((112 - 3+1)/2)+1=56,即56x56x64,再进行ReLU操作。
大部分卷积神经网络都会采用逐层递增(1⇒ 3 ⇒ 5 ⇒ 7)的方式。每经过一次池化层,卷积层过滤器的深度都会乘以 2;
注:卷积核具有的一个属性就是局部性。局部的程度取决于卷积核的大小。
一个卷积核在与 Input 不同区域做卷积时,它的参数是固定不变的。放在 DNN 的框架中理解,就是对同一层 Layer 中的神经元而言,它们的 和 是相同的,只是所连接的节点在改变。因此在 CNN 里,这叫做 共享权值偏置。卷积核的权值不需要提前设计,而是跟 DNN 一样利用 GD 来优化,我们只需要初始化。
权值共享:减轻过拟合 & 降低计算量
一个卷积层(Wx+b ⇒ ReLU ⇒ maxpooling)可以有多个不同的卷积核,而每一个卷积核都对应一个滤波后映射出的新图像,同一个新图像中的每一个像素都来自完全相同的卷积核,这就是卷积核的权值共享。权值共享的目的减轻过拟合 & 降低计算量。
1×1卷积核只有一个参数,这个核在输入上滑动,就相当于给输入数据乘以一个系数。(对于单通道和单个卷积核而言这样理解是可以的),看起来好像并没有什么意义,那它为什么还作用这么广泛了?可以从如下几个方向理解:
pooling池化的作用则体现在降采样:保留显著特征、降低特征维度,增大kernel的感受野。max_pool(value, ksize, strides, padding, name=None), ksize一般是[1, height, width, 1],因为我们不想在batch和channels上做池化,所以这两个维度设为了1。池化输出特征图计算和卷积计算公式相同,区别是池化是求卷积区域中的max,不涉及卷积计算。
池化层可对提取到的特征信息进行降维,一方面使特征图变小,简化网络计算复杂度并在一定程度上避免过拟合的出现;一方面进行特征压缩,提取主要特征。
注:padding
举例:池化输出特征图计算和卷积计算公式相同,区别是池化是求卷积区域中的max,不涉及卷积计算。
(1)pooling(kernel size 2×2,padding 0,stride 2)
32*32*16->pooling之后(32-2+0)/2 + 1 =16*16
pool3 = tf.nn.max_pool(layer3,[1,2,2,1],[1,2,2,1],padding=‘SAME’)
padding = p = (f-1)/2=(2-1)/2=0
(2)pooling(kernel size 3×3,padding 0,stride 1)
32*32*16 → pooling之后(32-3+0)/1 + 1 = 30*30
pool3 = tf.nn.max_pool(layer3,[1,3,3,1],[1,1,1,1])
综合考虑步长、padding后,计算两个矩阵卷积后的输出矩阵的维度大小的公式如下:
输出: [ [ ( n + 2 p − f ) / s ] + 1 ] × [ [ ( n + 2 p − f ) / s ] + 1 ] [[(n + 2p -f) /s] + 1] × [[(n + 2p -f) /s] + 1] [[(n+2p−f)/s]+1]×[[(n+2p−f)/s]+1]
对于VALID向上取整
[ ( n − f + 1 ) ) / s ] [(n -f + 1)) /s ] [(n−f+1))/s]
对于SAME向上取整
[ n / s ] [n/s ] [n/s]
对于卷积神经网络来说,每个卷积层(l层)的维度变化如下:
import tensorflow as tf
import numpy as np
input = tf.Variable(tf.random_normal([64, 5, 5, 3]))
filter =
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。