常用结构的tensorflow运用
1. 卷积层
'''通过tf.get_variable的方式创建过滤器的权重变量和偏置变量。'''
#权重变量:前两个维度过滤器尺寸,第三个维度当前层的深度,第四个维度表示过滤器的深度
filter_weight = tf.get_cariable('weights', [5, 5, 3, 16], initializer = tf.truncated_normal_initializer(stddev=0.1))
#偏置变量:过滤器深度
biases = tf.get_variable('biases', [16], initializer=tf.constant_initializer(0.1))
'''卷积层前向传播算法'''
#参数1:输入的节点矩阵[batch, _, _, _];参数2:权重;
#参数3:不同维上的步长[1,_, _, 1],即只对长和宽卷积步长。
#参数4:SAME表示全0填充,VALID表示不添加。
conv = tf.nn.conv2d(input, filter_weight, strides=[1, 1, 1, 1], padding='SAME')
bias = tf.nn.bias_add(conv, biases)
actives_conv = tf.nn.relu(bias)
2.池化层
'''最大池化层的前向传播'''
#参数1:当前层的节点矩阵;参数2:过滤器尺寸[1, _, _, 1]不可跨样例和节点矩阵深度
#参数3,参数4:同上
pool = tf.nn.max_pool(actived_conv, ksize=[1, 5, 5, 1], strides=[1, 2, 2, 1],padding='SAME')
3.区别
卷积层使用过滤器是横跨整个深度,而池化层使用过滤器只影响一个深度节点,所以池化层深度与输入深度相同。
三、经典卷积网络模型
1.LeNet-5模型
优点:大幅提高准确率
缺点:无法很好处理类似ImageNet这样比较大的图像数据集
C1层(卷积层):输入层32×32×1;滤波器尺寸5×5,深度6;不使用全0填充,步长1。
1. 对应特征图大小:特征图的大小28*28,这样能防止输入的连接掉到边界之外(32-5+1=28)。
feature map边长大小的具体计算参见:https://blog.csdn.net/Raoodududu/article/details/82287099
2. 参数个数:C1有156个可训练参数 (每个滤波器5*5=25个unit参数和一个bias参数,一共6个滤波器,共(5*5*1+1)*6=156个参数)
3. 链接个数/FLOPS个数::(28*28)*(5*5+1)*6=122,304个。左边是C1层每个feature map的神经元个数,右边是滤波器在输入层滑过的神经元个数,相乘即为连接数。(每个链接对应1次计算,由wa+b可知,每个参数参与1次计算,所以1个单位的偏置b也算进去)
----------------------------------------
S2层(下采样层):输入层28×28×6;滤波器尺寸2×2;步长2。
1. 对应特征图大小:特征图大小14*14
2. 参数个数:S2层有 12个 (6*(1+1)=12) 可训练参数。S2层 每个滤波器路过的4个邻域 的4个输入相加,乘以1个可训练参数w,再加上1个可训练偏置b(即一个滤波器对应两个参数)。(对于子采样层,每一个特征映射图的的可变参数需要考虑你使用的采样方式而定,如文中的采样方式,每一个特征映射图的可变参数数量为2个,有的采样方式不需要参数)
3. 链接个数/FLOPS个数:5880个连接,( 14*14* (2*2+1)*6 =5880) 。左边是滤波器在C1层滑过的神经元个数,右边是S2层每个feature map的神经元个数,相乘即为连接数。
----------------------------------------
C3层(卷积层):输入层14×14×6;滤波器尺寸5×5,深度16;不使用全0填充,步长1。
1. 对应特征图大小:特征图大小10*10(14-5+1=10)
2. 参数个数:(5×5×6+1)×16
3. 链接个数/FLOPS个数: 10*10*(5×5×6+1)×16=41600个连接。左边是C3层特征图大小,右边是滤波器滑过的S2层神经元个数。
------------------------------------------
S4层(下采样层):输入层10*10*16,;过滤器尺寸2*2,;全0填充,步长2。
1. 对应特征图大小:对应特征图大小5*5。
2. 参数个数:S4层有32个可训练参数。(每个特征图1个因子w和1个偏置b,16*(1+1)=32)
3. 链接个数/FLOPS个数:5*5× (2*2+1)*16 =2000个连接。左边是S4层神经元个数,右边是滤波器在C3层滑过的神经元个数,相乘即为连接数。
--------------------------------------------
C5层(卷积层或第一个全连接层):输入层5*5*16;过滤器尺寸5*5,深度120,步长1。
1. 对应特征图大小:特征图的大小为1*1。(5-5+1=1), 这构成了S4和C5之间的全连接。之所以仍将C5标示为卷积层而非全相联层,是因为如果LeNet-5的输入变大,而其他的保持不变,那么此时特征图的维数就会比1*1大。
2. 参数个数:(16*5*5+1)*120=48120个。滤波器个数120*16个,所以w有120*16*5*5个,同组16个滤波器共用一个b,所以有120个b。
3. 链接个数/FLOPS个数:1*1×48120,左边是C5层特征图大小(其实现在已经变成了单个神经元,大小1*1), 右边是滤波器滑过的神经元个数,相乘即为连接数,此处也即FLOPS个数。
--------------------------------------------
F6层(全连接层):输入120节点,输出84个节点。
1. 对应特征图大小:有84个单元(之所以选这个数字的原因来自于输出层的设计),与C5层全相连。
2. 参数个数:有 84* (120*(1*1)+1)=10164 个可训练参数。如同经典神经网络,F6层计算输入向量(120)和权重向量(1*1)之间的点积,再加上一个偏置(+1)。然后将其传递给sigmoid函数产生单元i的一个状态。
3. 链接个数/FLOPS个数:1*1×10164,左边是F6层特征图大小,右边是滤波器在C5层滑过的神经元个数。
--------------------------------------------
输出层:输入84个节点,输出节点10个。
参数个数:(10+1)×84。
--------------------------------------------