web-dev-qa-db-ja.com

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

MaxPooling1DとGlobalMaxPooling1Dの両方は、一時データの最大プーリング操作として説明されています。

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

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

それらの2つの機能の違いを視覚的に理解したいだけですか?

37
KayBay

Td; lrGlobalMaxPooling1D時間データの場合、steps次元で最大ベクトルを取ります。したがって、形状[10、4、10]のテンソルは、グローバルプーリング後に形状[10、10]のテンソルになります。 MaxPooling1Dもステップの最大値を取りますが、各ストライドのpool_sizeに制限されます。したがって、pooling_size=2stride=1を含む[10、4、10]テンソルは、MaxPooling(pooling_size=2, stride=1)の後の[10、3、10]テンソルです。

グラフィックエイドを使用したロングアンサー

3つの単語からなる単純な文があり、その単語のベクトルエンコーディングがあるとしましょう( Word2vec 埋め込みなど)。もちろん、通常は最大プールを超えてTensorを埋め込むことはありませんが、これは一例です。また、グローバルプーリングはチャネル間で機能しますが、この図では省略します。最後に、パディングでは状況が少し複雑になりますが、ここでもそれは必要ありません。

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)を使用します。これは、おそらくWordの「ライブ」のベクトル表現です。

確かに、ここではGlobalMaxPooling1Dがケラスでどのように定義されているか

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())
59
orsonady

@ThePassenger [x、y、z]は、各要素がy行z列の行列であるx要素の「配列」があるとみなすことができます。ただし、x行y列の行列があり、すべての要素にz要素の配列があります。

たとえば、プールはテンソルを小さくする方法です。たとえば、x行とy列の行列があり、プーリングを適用すると、x-n行と同じy-m列の行列が得られます。

1
bayethierno