TensorFlow - tf.nn.max_pool(value, ksize, strides, padding, data_format='NHWC', name=None)
tf.nn.max_pool(value, ksize, strides, padding, data_format=‘NHWC’, name=None)
value: A 4-DTensorwith shape[batch, height, width, channels]and typetf.float32.ksize: A list of ints that has length >= 4. The size of the window for each dimension of the input tensor.strides: A list of ints that has length >= 4. The stride of the sliding window for each dimension of the input tensor.padding: A string, either'VALID'or'SAME'. The padding algorithm. See the comment heredata_format: A string. ‘NHWC’ and ‘NCHW’ are supported.name: Optional name for the operation.
max poolingは、特定の領域から最大の数字を取り出します。ksizeが領域の大きさ、stridesが間隔です。ksizeが[1, 2, 2, 1]で、stridesが[1, 2, 2, 1]であれば、2 x 2のmax poolingです。2 x 2の領域から最大値をとります。間隔が2の場合出力サイズは半分になります。ksizeが[1, 3, 3, 1]で、stridesが[1, 2, 2, 1]の場合、3 x 3の領域から最大値をとり、間隔が2になるので、出力サイズは半分のままですが、数値を広範囲から取得することになるので、よりちょっとの差に動じなくなります。
tf.nn.max_poolの動きを確認してみます。 この画像を使います。

画像を読み込む
とりあえず画像を読み込んで、shapeを表示させてみます。
import tensorflow as tfimport numpy as npfrom PIL import Image
fpath = './img/sample_pic.jpg'jpg = tf.read_file(fpath)img_arr = tf.image.decode_jpeg(jpg, channels=3)
with tf.Session() as sess: img = sess.run(img_arr) print(img.shape)結果
(600, 800, 3)Max poolingしてみる
import tensorflow as tfimport numpy as npfrom PIL import Image
fpath = './img/sample_pic.jpg'jpg = tf.read_file(fpath)img_arr = tf.image.decode_jpeg(jpg, channels=3)img_4d = tf.cast(tf.reshape(img_arr, [1, 600, 800, 3]), tf.float32)pool = tf.nn.max_pool(img_4d, [1, 2, 2, 1], [1, 2, 2, 1], 'SAME')
with tf.Session() as sess: img, pool = sess.run([img_arr, pool]) print(img.shape) print(pool.shape)結果
(600, 800, 3)(1, 300, 400, 3)おーできてるっぽい。
画像を表示してみる。
Image.fromarray(np.uint8(pool.reshape(pool.shape[1:4]))).save('./img/maxpool1.jpg')結果 
では、わかり易くksizeを[1, 10, 10, 1]でやってみます。
import tensorflow as tfimport numpy as npfrom PIL import Image
fpath = './img/sample_pic.jpg'jpg = tf.read_file(fpath)img_arr = tf.image.decode_jpeg(jpg, channels=3)img_4d = tf.cast(tf.reshape(img_arr, [1, 600, 800, 3]), tf.float32)pool = tf.nn.max_pool(img_4d, [1, 10, 10, 1], [1, 2, 2, 1], 'SAME')
with tf.Session() as sess: img, pool = sess.run([img_arr, pool]) print(img.shape) print(pool.shape) Image.fromarray(np.uint8(pool.reshape(pool.shape[1:4]))).save('./img/maxpool2.jpg')結果
(600, 800, 3)(1, 300, 400, 3)