В чем разница между функциями Keras 'MaxPooling1D и GlobalMaxPooling1D?

Оба MaxPooling1D и GlobalMaxPooling1D описываются как максимальная операция объединения для временных данных.

keras.layers.pooling.MaxPooling1D(pool_size=2, strides=None, padding='valid')

Я понимаю, что GlobalMaxPooling1D не принимает входных параметров. keras.layers.pooling.GlobalMaxPooling1D()

Я просто хотел бы визуально понять, как они отличаются друг от друга в том, как они работают?

Ответ 1

Td; lr GlobalMaxPooling1D для временных данных принимает максимальный вектор над размерность шагов Таким образом, тензор с формой [10, 4, 10] становится глобальным тензором с формой [10, 10] после объединения. MaxPooling1D также берет максимум за шаги, но ограничен pool_size для каждого шага. Таким образом, тензор [10, 4, 10] с pooling_size=2 и stride=1 является тензором [10, 3, 10] после MaxPooling(pooling_size=2, stride=1)

Длинный ответ с графической помощью

Допустим, у нас есть простое предложение с 3 словами, и у нас есть некоторая векторная кодировка для слов (например, 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], где каждый временной шаг будет максимальным для 2D-пула. И так как у нас было 3 пула, мы эффективно сократили наши временные шаги с 4 до 3.

Однако, если мы используем GlobalMaxPooling1D, мы просто возьмем максимальный вектор этого предложения (Tensor), который, вероятно, является векторным представлением слова "live".

Действительно, вот как GlobalMaxPooling1D определяется в кератах

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

Ответ 2

@ThePassenger [x, y, z] можно рассматривать как "массив" с элементами x, где каждый элемент представляет собой матрицу с y строками и z столбцами. но также у вас есть матрица с x строками и y столбцами, а для каждого элемента у вас есть массив из z элементов.

Например, пулы - это просто способ уменьшить тензор, если у вас есть матрица из x строк и y столбцов, применение пулирования может дать вам матрицу из xn строк и одинаковых столбцов ym.