0%

Tensorflow卷积神经网络常用结构

1.卷积层

Tensorflow对卷积神经网络有着很好的支持,下面的程序实现了一个卷积层的前向传播。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import tensorflow as tf
filter_weight = tf.get_variable(

#前两个维度代表过滤器的尺寸,第三个维度表示当前层的深度,
#第四个表示过滤器的深度。

'weight',[5, 5, 3, 16],
initializer=tf.truncated_normal_initializer(stddev=0.1)
)

biases = tf.get_variable(
#由于当前过滤器的深度为16,所以偏置相为16,也是神经网络中下一层节点矩阵深度
'biases',[16],initializer=tf.constant_initializer(0.1)
)

conv = tf.nn.conv2d(
input,filter_weight,strides=[1,1,1,1],padding='SAME'
)

bias = tf.nn.bias_add(conv,biases)

#通过ReLU函数激活,去线性化
actived_conv = tf.nn.relu(bias)

注:

1.tf.nn.conv2d提供了一个简单方便的函数来实现卷积层前向传播的算法。该函数第一个输入为当前层的节点矩阵,注意该矩阵为一个四维矩阵,后面三个维度对应一个节点矩阵,第一维输入一个batch。如input[0,:,:,:]指输入第一张图片,input[1,:,:,:]指输入第二张图片。该函数提供的第二个参数是卷积层的权重,第三个为不同维度上的步长,虽然第三个参数提供的一个长度为4的数组,但是第一维和第四维一定为1,因为卷积层的步数只对矩阵的长宽有效。最后一个参数为填充(padding)的方法,一共有’SAME’和’VALID’两种选择,其中SAME是指添加全0填充,VAILID表示不添加。

2.tf.nn.bias_add提供一个方便的函数给每个节点加上一个偏置项。注意这里不能直接使用方法,因为矩阵上不同位置的节点都需要加上同样的偏置项。

2.池化层

1
pool = tf.nn.max_pool(actived_conv,ksize=[1,3,3,1],strides=[1,2,2,1],padding='SAME')

tf.nn.max_pool实现了最大池化层的前向传播,他的参数和tf.nn.conv2d函数类似。ksize提供了过滤器的尺寸,strides提供了步长信息,padding提供了是否需要使用全0填充。