私はテンソルフローバックエンドを使用しています。
畳み込み、最大プーリング、平坦化、高密度レイヤーを順次適用します。畳み込みには3D入力(高さ、幅、color_channels_depth)が必要です。
畳み込み後、これは(高さ、幅、フィルターの数)になります。
最大プーリングの高さを適用すると、幅が変化します。しかし、レイヤーを平坦化した後、正確に何が起こるのでしょうか?例えば。
平坦化前の入力が(24,24,32)の場合、どのように平坦化されますか?
それは、各フィルター番号の高さ、重量の連続的な(24 * 24)のような連続的なものですか、それとも他の方法ですか?例は実際の値で評価されます。
Flatten()
演算子は、最後の次元から始まる値を展開します(少なくともTheanoの場合、TFのように "channels last"ではなく、 "channels first"です。環境でTensorFlowを実行できません)。これはnumpy.reshape
と 'C'の順序付けで同等です:
「C」は、Cのようなインデックス順序を使用して要素の読み取り/書き込みを行うことを意味します。最後の軸インデックスが最も速く変化し、最初の軸インデックスが最も遅く変化します。
以下に、Keras Functional APIでのFlatten
演算子を示すスタンドアロンの例を示します。環境に簡単に適応できる必要があります。
import numpy as np
from keras.layers import Input, Flatten
from keras.models import Model
inputs = Input(shape=(3,2,4))
# Define a model consisting only of the Flatten operation
prediction = Flatten()(inputs)
model = Model(inputs=inputs, outputs=prediction)
X = np.arange(0,24).reshape(1,3,2,4)
print(X)
#[[[[ 0 1 2 3]
# [ 4 5 6 7]]
#
# [[ 8 9 10 11]
# [12 13 14 15]]
#
# [[16 17 18 19]
# [20 21 22 23]]]]
model.predict(X)
#array([[ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.,
# 11., 12., 13., 14., 15., 16., 17., 18., 19., 20., 21.,
# 22., 23.]], dtype=float32)
24 * 24 * 32のように連続しており、次のコードに示すように形状を変更します。
def batch_flatten(x):
"""Turn a nD tensor into a 2D tensor with same 0th dimension.
In other words, it flattens each data samples of a batch.
# Arguments
x: A tensor or variable.
# Returns
A tensor.
"""
x = tf.reshape(x, tf.stack([-1, prod(shape(x)[1:])]))
return x
テンソルを平坦化するとは、1つを除くすべての次元を削除することを意味します。
KerasのFlattenレイヤーは、テンソルに含まれる要素の数に等しい形状を持つように、テンソルの形状を変更します。
これは、要素の1次元配列を作成するのと同じです。
たとえば、VGG16モデルでは、わかりやすいことがわかります。
>>> model.summary()
Layer (type) Output Shape Param #
================================================================
vgg16 (Model) (None, 4, 4, 512) 14714688
________________________________________________________________
flatten_1 (Flatten) (None, 8192) 0
________________________________________________________________
dense_1 (Dense) (None, 256) 2097408
________________________________________________________________
dense_2 (Dense) (None, 1) 257
===============================================================
Flatten_1レイヤーの形状が(なし、8192)であることに注意してください。8192は実際には4 * 4 * 512です。
PS、なしはanyディメンション(または動的ディメンション)を意味しますが、通常は1として読み取ることができます。詳細は こちら 。