在神经网络中,池化函数一般跟在卷积函数的下一层,它们也被定义在tensorflow-1.1.0/ tensorflow/python/ops下的nn.py和gen_nn_ops.py文件中。
tf.nn.avg_pool(value, ksize, strides, padding, data_format='NHWC', name=None)
tf.nn.max_pool(value, ksize, strides, padding, data_format='NHWC', name=None)
tf.nn.max_pool_with_argmax(input, ksize, strides, padding, Targmax=None, name=None)
tf.nn.avg_pool3d(input, ksize, strides, padding, name=None)
tf.nn.max_pool3d(input, ksize, strides, padding, name=None)
tf.nn.fractional_avg_pool(value, pooling_ratio, pseudo_random=None, overlapping=None,
deterministic=None, seed=None, seed2=None, name=None)
tf.nn.fractional_max_pool(value, pooling_ratio, pseudo_random=None, overlapping=None,
deterministic=None, seed=None, seed2=None, name=None)
tf.nn.pool(input, window_shape, pooling_type, padding, dilation_rate=None, strides=None,
name=None, data_format=None)
池化操作是利用一个矩阵窗口在张量上进行扫描,将每个矩阵窗口中的值通过取最大值或平均值来减少元素个数。每个池化操作的矩阵窗口大小是由ksize指定的,并且根据步长strides决定移动步长。下面就分别来说明。
(1)tf.nn.avg_pool(value, ksize, strides, padding, data_format='NHWC', name=None)。这个函数计算池化区域中元素的平均值。
def avg_pool(value, ksize, strides, padding, data_format='NHWC', name=None)
# 输入:
# value:一个四维的张量。数据维度是[batch, height, width, channels]
# ksize:一个长度不小于4的整型数组。每一位上的值对应于输入数据张量中每一维的窗口对应值
# strides:一个长度不小于4的整型数组。该参数指定滑动窗口在输入数据张量每一维上的步长
# padding:一个字符串,取值为SAME或者VALID
# data_format: 'NHWC'代表输入张量维度的顺序,N为个数,H为高度,W为宽度,C为通道数(RGB三
# 通道或者灰度单通道)
# name(可选):为这个操作取一个名字
# 输出:一个张量,数据类型和value相同
使用示例如下:
input_data = tf.Variable( np.random.rand(10,6,6,3), dtype = np.float32 )
filter_data = tf.Variable( np.random.rand(2, 2, 3, 10), dtype = np.float32)
y = tf.nn.conv2d(input_data, filter_data, strides = [1, 1, 1, 1], padding = 'SAME')
output = tf.nn.avg_pool(value = y, ksize = [1, 2, 2, 1], strides = [1, 1, 1, 1],
padding ='SAME')
上述代码打印出tf.shape(output)的结果是[10 6 6 10]。计算输出维度的方法是:shape(output) = (shape(value) - ksize + 1) / strides。
(2)tf.nn.max_pool(value, ksize, strides, padding, data_format='NHWC', name=None)。这个函数是计算池化区域中元素的最大值。
使用示例如下:
input_data = tf.Variable( np.random.rand(10,6,6,3), dtype = np.float32 )
filter_data = tf.Variable( np.random.rand(2, 2, 3, 10), dtype = np.float32)
y = tf.nn.conv2d(input_data, filter_data, strides = [1, 1, 1, 1], padding = 'SAME')
output = tf.nn.max_pool(value = y, ksize = [1, 2, 2, 1], strides = [1, 1, 1, 1],
padding ='SAME')
上述代码打印出tf.shape(output)的结果是[10 6 6 10]。
(3)tf.nn.max_pool_with_argmax(input, ksize, strides, padding, Targmax = None, name=None)。这个函数的作用是计算池化区域中元素的最大值和该最大值所在的位置。
在计算位置argmax的时候,我们将input铺平了进行计算,所以,如果input = [b, y, x, c],那么索引位置是(( b height + y) width + x) * channels + c。
使用示例如下,该函数只能在GPU下运行,在CPU下没有对应的函数实现:
input_data = tf.Variable( np.random.rand(10,6,6,3), dtype = tf.float32 )
filter_data = tf.Variable( np.random.rand(2, 2, 3, 10), dtype = np.float32)
y = tf.nn.conv2d(input_data, filter_data, strides = [1, 1, 1, 1], padding = 'SAME')
output, argmax = tf.nn.max_pool_with_argmax(input = y, ksize = [1, 2, 2, 1],
strides = [1, 1, 1, 1], padding = 'SAME')
返回结果是一个张量组成的元组(output, argmax),output表示池化区域的最大值;argmax的数据类型是Targmax,维度是四维。
(4)tf.nn.avg_pool3d()和tf.nn.max_pool3d()分别是在三维下的平均池化和最大池化。
(5)tf.nn.fractional_avg_pool()和tf.nn.fractional_max_pool()分别是在三维下的平均池化和最大池化。
(6)tf.nn.pool(input, window_shape, pooling_type, padding, dilation_rate=None, strides=None, name=None, data_format=None)。这个函数执行一个N维的池化操作。