MaxPooling1D、GlobalMaxPooling1Dとも、時間データに対する最大プーリング操作として記述されている。
keras.layers.pooling.MaxPooling1D(pool_size=2, strides=None, padding='valid')` となります。
GlobalMaxPooling1Dは入力パラメータを取らないということですね。
keras.layers.pooling.GlobalMaxPooling1D()
です。
ただ、この2つの動作の違いを視覚的に理解したいのですが?
Td;lr GlobalMaxPooling1D
は、時間データに対して、ステップの次元の最大ベクトルを取ります。
次元の最大ベクトルを取る。つまり、[10, 4, 10]のテンソルは、グローバルプーリング後に[10, 10]のテンソルになる。MaxPooling1Dはステップの最大値をとるが、各ストライドの pool_size に制限される。つまり、
pooling_size=2で
stride=1の [10, 4, 10] テンソルは
MaxPooling(pooling_size=2, stride=1)` の後は [10, 3, 10] テンソル となる。
図解入り長文問題集へ
例えば、4つの単語からなる簡単な文があり、その単語のベクトルエンコーディング(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.
ということは、[1, 3, 3]のTensorになり、各タイムステップは2Dプールでの最大値となる。そして、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())
ThePassenger [x, y, z] は、x 個の要素を持ち、各要素が y 行 z 列の行列である "array" と見ることもできますが、x 行 y 列の行列で、各要素に対して z 個の要素の配列を持っているとすることも可能です。
pools はテンソルを減らす方法です。例えば、x 行 y 列の行列がある場合、pooling を適用すると x-n 行、同じ y-m 列の行列が得られます。