Td;lr GlobalMaxPooling1D
pour les données temporelles prend le vecteur max sur les de la dimension des pas. Ainsi, un tenseur de forme [10, 4, 10] devient un tenseur de forme [10, 10] après regroupement global. MaxPooling1D
prend également le maximum sur les pas, mais il est limité à une taille de bassin pour chaque pas. Donc un tenseur [10, 4, 10] avec pooling_size=2
y stride=1
est un tenseur [10, 3, 10] après que MaxPooling(pooling_size=2, stride=1)
Réponse longue avec aide graphique
Supposons que nous ayons une phrase simple avec 4 mots et que nous ayons un encodage vectoriel pour les mots (comme word2vec ). Bien sûr, vous ne ferez pas de pooling maximum sur un tenseur d'intégration, mais cela devrait suffire pour un exemple. La mise en commun globale fonctionne également entre les canaux, mais je n'en parlerai pas dans cette illustration. Enfin, les choses deviennent légèrement plus compliquées avec le padding, mais nous n'en avons pas besoin ici non plus.
Supposons que nous ayons MaxPooling1D(pool_size=2, strides=1).
Dans ce cas
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.
Il en résultera donc un tenseur [1, 3, 3], chaque pas de temps étant le maximum sur un bassin 2D. Et comme nous avions 3 bassins, nous avons effectivement réduit l'échantillonnage de nos pas de temps de 4 à 3.
Toutefois, si nous utilisons GlobalMaxPooling1D
nous prendrons simplement le vecteur maximum de cette phrase (Tensor) qui est probablement la représentation vectorielle du mot "live".
En effet, voici comment GlobalMaxPooling1D est défini dans 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)
J'espère que cela vous aidera. N'hésitez pas à me demander des éclaircissements.
En outre, voici un exemple avec lequel vous pouvez jouer :
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())