テンソルフローに関するいくつかの基本を理解しようとしていたのですが、最大プーリング2Dレイヤーのドキュメントを読んでいるときに行き詰まりました: https://www.tensorflow.org/tutorials/layers#pooling_layer_1
Max_pooling2dの指定方法は次のとおりです。
pool1 = tf.layers.max_pooling2d(inputs=conv1, pool_size=[2, 2], strides=2)
ここで、conv1
は形状[batch_size, image_width, image_height, channels]
のテンソルを持ち、具体的にはこの場合は[batch_size, 28, 28, 32]
です。
したがって、入力は形状のテンソルです:[batch_size, 28, 28, 32]
。
最大プーリング2Dレイヤーについての私の理解は、サイズpool_size
(この場合は2x2)のフィルターを適用し、スライディングウィンドウをstride
(これも2x2)移動することです。これは、画像のwidth
とheight
の両方が半分になることを意味します。つまり、チャネルあたり14x14ピクセル(合計32チャネル)になります。つまり、出力は形状のテンソルになります。 [batch_size, 14, 14, 32]
。
ただし、上記のリンクによると、出力テンソルの形状は[batch_size, 14, 14, 1]
です。
Our output tensor produced by max_pooling2d() (pool1) has a shape of
[batch_size, 14, 14, 1]: the 2x2 filter reduces width and height by 50%.
ここで何が欠けていますか?
32はどのように1に変換されましたか?
ここで後で同じロジックを適用します: https://www.tensorflow.org/tutorials/layers#convolutional_layer_2_and_pooling_layer_2
ただし、今回は正しいです。つまり、[batch_size, 14, 14, 64]
は[batch_size, 7, 7, 64]
になります(チャネル数は同じです)。
はい、strides = 2x2で2x2maxプールを使用すると、データが半分に減少し、出力深度は変更されません。これはあなたの与えられた私のテストコードです、出力形状は(14, 14, 32)
です、多分何かが間違っていますか?
#!/usr/bin/env python
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets('./MNIST_data/', one_hot=True)
conv1 = tf.placeholder(tf.float32, [None,28,28,32])
pool1 = tf.layers.max_pooling2d(inputs=conv1, pool_size=[2,2], strides=2)
print pool1.get_shape()
出力は次のとおりです。
Extracting ./MNIST_data/train-images-idx3-ubyte.gz
Extracting ./MNIST_data/train-labels-idx1-ubyte.gz
Extracting ./MNIST_data/t10k-images-idx3-ubyte.gz
Extracting ./MNIST_data/t10k-labels-idx1-ubyte.gz
(?, 14, 14, 32)
ニコラ、思った通り修正しました。
畳み込みとプーリングの概念を学び、このスレッドに出くわしました。有益なドキュメントに私を連れて行くあなたの質問をありがとう。