54 votes

Quelle est la différence entre les fonctions MaxPooling1D et GlobalMaxPooling1D de Keras ?

MaxPooling1D et GlobalMaxPooling1D sont tous deux décrits comme une opération de mise en commun 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()

J'aimerais simplement comprendre visuellement en quoi les deux diffèrent dans leur fonctionnement ?

86voto

orsonady Points 4926

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

3 votes

C'est une excellente explication. Merci beaucoup !

0 votes

Qu'est-ce qu'un tenseur [x, y, z] ? Je suis novice en matière de tenseurs. J'ai compris qu'il s'agit d'un objet de relation linéaire en 3 dimensions. Et que sont les pools ? Est-ce le nombre de mots lus dans ce cas ? N'hésitez pas à me rediriger vers un lien ou un tutoriel si c'est trop long à expliquer.

2 votes

Comment K.max() fonctionne-t-il sur deux vecteurs ? en comparant la norme ?

1voto

bayethierno Points 93

@ThePassenger [x, y, z] peut être vu comme un "tableau" avec x éléments où chaque élément est une matrice avec y lignes et z colonnes. Mais aussi comme une matrice avec x lignes et y colonnes et pour chaque élément vous avez un tableau de z éléments.

Par exemple, si vous avez une matrice de x lignes et y colonnes, l'application de la mise en commun peut vous donner une matrice de x-n lignes et les mêmes y-m colonnes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X