卷积操作之后往往执行池化操作,进一步压缩数据
池化
池化函数将平面内某一位置及其相邻位置的特征值进行统计汇总,并将汇总后的结果作为这一位置在该平面内的值。常见的池化操作有最大池化、平均池化。
TensorFlow中池化函数
tf.nn.max_pool
最大池化
tf.nn.max_pool(
input, ksize, strides, padding, data_format=None, name=None
)
参数 | 讲解 |
---|---|
input | 秩N + 2张量,形状的[batch_size] + input_spatial_shape + [num_channels]如果data_format不与“NC”(缺省),或启动[batch_size, num_channels] + input_spatial_shape如果与“NC” DATA_FORMAT启动。池发生过仅在空间维度。 |
ksize | int或列表ints ,其具有长度1 , N或N+2 。窗口用于输入张量的每个维度的尺寸。 |
strides | int或列表ints ,其具有长度1 , N或N+2 。用于将输入张量的每个维度的滑动窗口的步幅。 |
padding | 一个字符串,无论是’VALID’或’SAME’ 。填充算法。见的“收益”部分tf.nn.convolution了解详情。 |
data_format | 指定通道尺寸。对于N = 1它可以是 “NWC”(默认)或 “NCW”,对于N = 2它可以是 “NHWC”(默认)或 “NCHW” 和对于N = 3任一 “NDHWC”(默认值)或“NCDHW”。 |
name | 一种操作(可选)的名称。 |
操作实例
import numpy as np
import tensorflow as tf
x_in = np.array([[
[[2], [1], [2], [0], [1]],
[[1], [3], [2], [2], [3]],
[[1], [1], [3], [3], [0]],
[[2], [2], [0], [1], [1]],
[[0], [0], [3], [1], [2]], ]])
kernel_in = np.array([
[ [[2, 0.1]], [[3, 0.2]] ],
[ [[0, 0.3]],[[1, 0.4]] ], ])
x = tf.constant(x_in, dtype=tf.float32)
kernel = tf.constant(kernel_in, dtype=tf.float32)
conv = tf.nn.conv2d(x, kernel, strides=[1, 1, 1, 1], padding='VALID')
#max_pool()函数实现了最大池化层的前向传播过程
#参数value为输入数据,strides为提供了步长信息,padding提供了是否使用全0填充。
pool = tf.nn.max_pool(conv, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding="SAME")
init_op=tf.global_variables_initializer()
with tf.Session() as sess:
init_op.run()
# print(conv)
# print(sess.run(conv))
print(sess.run(pool))
#结果输出
'''
[[[[15. 2.2]
[13. 2.7]]
[[11. 1.7]
[16. 1.5]]]]
'''
其他池化函数
tf.nn.max_pool1d(
input, ksize, strides, padding, data_format='NWC', name=None
)
tf.nn.max_pool2d(
input, ksize, strides, padding, data_format='NHWC', name=None
)
tf.nn.max_pool3d(
input, ksize, strides, padding, data_format='NDHWC', name=None
)
tf.nn.max_pool_with_argmax(
input, ksize, strides, padding, data_format='NHWC',
output_dtype=tf.dtypes.int64, include_batch_in_index=False, name=None
)
tf.nn.avg_pool(
input, ksize, strides, padding, data_format=None, name=None
)
tf.nn.avg_pool1d(
input, ksize, strides, padding, data_format='NWC', name=None
)
tf.nn.avg_pool2d(
input, ksize, strides, padding, data_format='NHWC', name=None
)
tf.nn.avg_pool3d(
input, ksize, strides, padding, data_format='NDHWC', name=None
)