Ответ 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())