Keras の MaxPooling1D 関数と GlobalMaxPooling1D 関数の違いは何ですか? 質問する

Keras の MaxPooling1D 関数と GlobalMaxPooling1D 関数の違いは何ですか? 質問する

MaxPooling1D と GlobalMaxPooling1D はどちらも、時間データの最大プーリング操作として説明されています。

keras.layers.pooling.MaxPooling1D(pool_size=2, strides=None, padding='valid')

GlobalMaxPooling1D は入力パラメータを取らないことを理解しています。keras.layers.pooling.GlobalMaxPooling1D()

これら 2 つの動作の違いを視覚的に理解したいだけです。

ベストアンサー1

翻訳: GlobalMaxPooling1D時間データの場合、ステップ次元の最大ベクトルを取る。したがって、形状[10, 4, 10]のテンソルは、グローバルプーリング後に形状[10, 10]のテンソルになる。MaxPooling1Dステップでも最大を取るが、各ストライドのpool_sizeに制限される。したがって、およびを持つ[10, 4, 10]テンソルはpooling_size=2stride=1グローバルプーリング後に[10, 3, 10]テンソルになる。MaxPooling(pooling_size=2, stride=1)

グラフィックによる長い回答

4つの単語からなる簡単な文があり、単語のベクトルエンコードがあるとします(例えばワード2ベクトル埋め込み)。もちろん、通常は埋め込みテンソルに対して最大プールを行うことはありませんが、例としてはこれで十分でしょう。また、グローバル プーリングはチャネル間で機能しますが、この図では省略します。最後に、パディングによって状況は少し複雑になりますが、ここでも必要ありません。

MaxPooling1D(pool_size=2, strides=1).次のような場合を考えてみましょう

the  [[.7, -0.2, .1]   | pool size is two                  
boy   [.8, -.3,  .2]   | so look at two words at a time    | stride=1 will
will  [.2, -.1,  .4]     and take the max over those       | move the pool down
live  [.4  -.4,  .8]]    2 vectors. Here we looking         1 word. Now we look  
                            'the' and 'boy'.                'boy' and 'will' and 
                                                            take the max.

その結果、各タイムステップが 2D プールの最大値となる [1, 3, 3] テンソルが生成されます。プールが 3 つあるため、タイムステップを 4 から 3 にダウンサンプリングしたことになります。

ただし、 を使用する場合は、GlobalMaxPooling1Dその文の最大ベクトル (Tensor) を取得するだけであり、これはおそらく「live」という単語のベクトル表現です。

実際、GlobalMaxPooling1Dはkerasで次のように定義されています。

class GlobalMaxPooling1D(_GlobalPooling1D):
    """Global max pooling operation for temporal data.
    # Input shape
        3D tensor with shape: `(batch_size, steps, features)`.
    # Output shape
        2D tensor with shape:
        `(batch_size, features)`
    """

    def call(self, inputs):
        return K.max(inputs, axis=1)

それがお役に立てば幸いです。何かご不明な点がございましたらお気軽にお問い合わせください。

さらに、試してみることができる例を次に示します。

import numpy as np
from keras.models import Sequential
from keras.layers import Dense, LSTM, GlobalMaxPooling1D, MaxPooling1D

D = np.random.rand(10, 6, 10)

model = Sequential()
model.add(LSTM(16, input_shape=(6, 10), return_sequences=True))
model.add(MaxPooling1D(pool_size=2, strides=1))
model.add(LSTM(10))
model.add(Dense(1))
model.compile(loss='binary_crossentropy', optimizer='sgd')

# print the summary to see how the dimension change after the layers are 
# applied

print(model.summary())

# try a model with GlobalMaxPooling1D now

model = Sequential()
model.add(LSTM(16, input_shape=(6, 10), return_sequences=True))
model.add(GlobalMaxPooling1D())
model.add(Dense(1))
model.compile(loss='binary_crossentropy', optimizer='sgd')

print(model.summary())

おすすめ記事