web-dev-qa-db-ja.com

Kerasでのレイヤーの平坦化の仕組み

私はテンソルフローバックエンドを使用しています。

畳み込み、最大プーリング、平坦化、高密度レイヤーを順次適用します。畳み込みには3D入力(高さ、幅、color_channels_depth)が必要です。

畳み込み後、これは(高さ、幅、フィルターの数)になります。

最大プーリングの高さを適用すると、幅が変化します。しかし、レイヤーを平坦化した後、正確に何が起こるのでしょうか?例えば。

平坦化前の入力が(24,24,32)の場合、どのように平坦化されますか?

それは、各フィルター番号の高さ、重量の連続的な(24 * 24)のような連続的なものですか、それとも他の方法ですか?例は実際の値で評価されます。

14
ssg

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)
30
dhinckley

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
3
Harsha Pokkalla

テンソルを平坦化するとは、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として読み取ることができます。詳細は こちら

1
prosti