web-dev-qa-db-ja.com

TensorFlowのMaxPooling 2D Layerの出力テンソルとは何ですか?

テンソルフローに関するいくつかの基本を理解しようとしていたのですが、最大プーリング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)移動することです。これは、画像のwidthheightの両方が半分になることを意味します。つまり、チャネルあたり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]になります(チャネル数は同じです)。

7

はい、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)
3
大宝剑

ニコラ、思った通り修正しました。

畳み込みとプーリングの概念を学び、このスレッドに出くわしました。有益なドキュメントに私を連れて行くあなたの質問をありがとう。

1
Tora