MaxPooling1D et GlobalMaxPooling1D sont décrits comme une opération de mise en pool maximale pour les données temporelles.
keras.layers.pooling.MaxPooling1D(pool_size=2, strides=None, padding='valid')
Je comprends que GlobalMaxPooling1D ne prend aucun paramètre d’entrée. keras.layers.pooling.GlobalMaxPooling1D()
Je voudrais juste comprendre visuellement en quoi leur travail diffère?
Td; lrGlobalMaxPooling1D
pour les données temporelles prend le vecteur max sur la dimension des étapes Ainsi, un tenseur de forme [10, 4, 10] devient un tenseur de forme [10, 10] après la mise en commun globale. MaxPooling1D
prend le maximum aussi mais est limité à une taille de pool pour chaque foulée. Donc, un tenseur [10, 4, 10] avec pooling_size=2
et stride=1
est un tenseur [10, 3, 10] après MaxPooling(pooling_size=2, stride=1)
Réponse longue avec aide graphique
Disons que nous avons une phrase simple avec 3 mots et que nous avons un encodage vectoriel pour les mots (comme Word2vec embeddings). Bien sûr, vous n’utiliserez pas normalement le pool maximum et l’intégration de Tensor, mais cela devrait servir d’exemple. La mise en commun globale fonctionne également sur tous les canaux, mais je vais laisser cela en dehors de cette illustration. Enfin, le rembourrage complique un peu les choses, mais nous n’en avons pas besoin ici non plus.
Supposons que nous ayons MaxPooling1D(pool_size=2, strides=1).
Alors
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.
Cela donnera donc un [1, 3, 3] Tenseur, chaque pas étant le maximum sur un pool 2D. Et depuis que nous avons 3 piscines, nous avons sous-échantillonné nos timesteps de 4 à 3.
Cependant, si nous utilisons GlobalMaxPooling1D
, nous prendrons simplement le vecteur max 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)
Espérons que cela aide, s'il vous plaît demandez-moi de clarifier quelque chose.
De plus, voici un exemple avec lequel vous pouvez jouer:
import numpy as np
from keras.models import Sequential
from keras.layers import Dense, LSTM, GlobalMaxPooling1D
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] signifie que vous avez un "tableau" avec x éléments, chaque élément étant une matrice à y lignes et z colonnes.
les pools ne sont qu'un moyen de diminuer un tenseur, par exemple, si vous avez une matrice de x lignes et que y colonnes appliquant le pooling, vous pouvez obtenir une matrice de x-n lignes et les mêmes colonnes y.