一、认知概念
https://blog.csdn.net/Raoodududu/article/details/82287099
二、 常用结构的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层(下采样层)