Tensorflow学习笔记之池化层

Tensorflow学习笔记之池化层

池化层的作用
池化层用于进一步缩小经卷积层处理过后的节点矩阵,从而进一步减少最后交付给全连接神经网络的参数个数。虽然池化层的作用遭到过质疑,但是在大多数模型中仍然使用了池化层。

池化层的处理
池化层中有一个类似于卷积层中过滤器的设置。不过相比卷积层中过滤器的加权求和,池化层中过滤器只是简单地求相应尺寸内子节点矩阵的最大值或者平均值。

池化层与卷积层的区别
池化层中的过滤器与卷积层中过滤器最大的区别是:卷积层内的过滤器可以同时处理当前层中整个深度下的子节点矩阵,而池化层内的过滤器只能一层层深度地处理当前层的子节点矩阵。所以池化层过滤器除了像卷积层内一样在二维上从节点矩阵左上角移动至右下角以外,还会在深度上进行移动。

在Tensorflow中主要提供了最大池与平均池两个池化层,这里以最大池为例。

tf.nn.max_pool(input,ksize=[1,3,3,1],strides=[1,1,1,1],padding="SAME")

ksize表示了池化层过滤器的尺寸,由于池化层中过滤器不能跨样例与当前层深度,所以第一与第四维都为1。二,三维上的数值表示过滤器处理子节点矩阵的尺寸,一般为3,3或者5,5。

strides表示过滤器移动的步长,第一维一般只能为1,因为不能跨样例移动。第二,三维与卷积层一样,表示在子节点矩阵二维上移动的步长,第四维表示的是在经过池化层后在下一层中跨深度的步长,通过设置这个值可以缩短下一层深度,不过一般也都是设为1。

padding有两个取值,取值”SAME”表示使用全0填充,取值”VALID”表示不用全0填充

这里给出一个同时使用了卷积层与池化层的例子。

import tensorflow as tf
input=tf.random_normal(dtype=tf.float32,
                       shape=[1,5,5,3])
#卷积层过滤器的设置
filter_weight=tf.get_variable('weights',
                              shape=[3,3,3,16],
                               initializer=tf.truncated_normal_initializer(stddev=0.1))
#偏置项的设置
biases=tf.get_variable('biases',shape=[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)
active_conv=tf.nn.relu(bias)
#池化层处理
after_pool=tf.nn.max_pool(active_conv,ksize=[1,3,3,1],strides=[1,1,1,1],padding="VALID")

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    print(sess.run(active_conv))
    print(sess.run(after_pool))

结果:
Tensor(“Relu:0”, shape=(1, 5, 5, 16), dtype=float32)
Tensor(“MaxPool:0”, shape=(1, 3, 3, 16), dtype=float32)

卷积层使用了全0填充所以得到的节点矩阵二维不变,池化层没有使用,所以处理后的矩阵二维尺寸变小了。

猜你喜欢

转载自blog.csdn.net/qq_38069320/article/details/81515401