使用TensorFlow搭建CNN卷积层和池化层

下面代码中,输入图像色彩通道为3;卷积层的过滤器大小设置为5*5,深度为16,步长为1;池化层的过滤器大小设置为3*3,步长为2。卷积层全0填充:使输入得图像的输出时大小相同。池化层全0填充:使图像大小与池化过滤器能完全重合。

import tensorflow as tf

# 构建卷积层

# 通过tf.get_variable的方式创建过滤器的权重和偏置项
# 卷积层的参数个数之和过滤器的尺寸、深度以及当前层节点矩阵的深度有关
# 声明四维矩阵,前两维为过滤器的尺寸,第三维为当前层的深度,第四维为过滤器深度
filter_weight = tf.get_variable('weight', [5, 5, 3, 16],
                                initializer=tf.truncated_normal_initializer(stddev=0.1))
biases = tf.get_variable('biases', [16], initializer=tf.constant_initializer(0.1))

# tf.nn.conv2d非常方便实现卷积层前向传播算法
# 第一个输入为当前层的节点矩阵,这个矩阵为四维矩阵,第一维对应一个输入batch,后三维为节点矩阵
# 例如,input[0,:,:,:]表示第一张图片,input[1,:,:,:]为第二张图片
# 第二个输入为卷积层的权重,第三个输入为不同维度上的步长
# 第三个输入提供的是一个长度为4的数组,但是数组第一位和第四位一定要是1,因为卷积层的步长只对矩阵的长和宽有效
# 第四个输入时填充的方法,TensorFlow只提供两种选择,SAME为全0填充,VALID为不添加
conv = tf.nn.conv2d(input, filter_weight, strides=[1, 1, 1, 1], padding='SAME')

# tf.nn.bias_add添加偏置项,同一层同一个偏置
bias = tf.nn.bias_add(conv, biases)
#将计算结果通过ReLU激活函数完成去线性化
actived_conv = tf.nn.relu(bias)

# 构建池化层

# tf.nn.avg_pool函数实现了平均池化层,用法与max_pool相似
# tf.nn.max_pool实现了最大池化层的前向传播过程,参数和conv2d类似
# ksize提供了过滤器的尺寸,数组第一位和第四位一定要是1,比较常用的是[1,2,2,1]和【1,3,3,1】
# strides提供了步长,数组第一位和第四位一定要是1
# padding提供了是否全0填充
pool = tf.nn.max_pool(actived_conv, ksize=[1, 3, 3, 1],
                      strides=[1, 2, 2, 1], padding='SAME')

你可能感兴趣的:(TensorFlow,深度学习)