web-dev-qa-db-fra.com

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

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?

27
KayBay

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

@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.

0
bayethierno