MaxPooling1D和GlobalMaxPooling1D都是用于时间序列数据的最大池化操作。
keras.layers.pooling.MaxPooling1D(pool_size=2, strides=None, padding='valid')
我理解GlobalMaxPooling1D不需要输入参数。keras.layers.pooling.GlobalMaxPooling1D()
我只想直观地了解它们在工作方式上的区别。
MaxPooling1D和GlobalMaxPooling1D都是用于时间序列数据的最大池化操作。
keras.layers.pooling.MaxPooling1D(pool_size=2, strides=None, padding='valid')
我理解GlobalMaxPooling1D不需要输入参数。keras.layers.pooling.GlobalMaxPooling1D()
我只想直观地了解它们在工作方式上的区别。
Td;lr GlobalMaxPooling1D
用于时间序列数据,对于 steps 维度取最大向量。因此,一个形状为 [10,4,10] 的张量在全局池化后变成形状为 [10,10] 的张量。MaxPooling1D
也会在 steps 维度上取最大值,但受到每个步长的 pool_size 约束。所以一个形状为 [10,4,10] 的张量,经过 MaxPooling(pool_size=2, stride=1)
后,变成形状为 [10,3,10] 的张量。
Long answer with graphic aid
假设我们有一个简单的由 4 个单词组成的句子,我们有一些单词的向量编码(如 word2vec),当然你通常不会对嵌入张量进行最大池化,但这可以作为一个例子。全局池化还可以跨通道处理,但本文不涉及这方面内容。最后,填充操作会使情况略微复杂,但这里不需要。
假设我们有 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] 的张量,其中每个时间步都是二维池化的最大值。由于我们有 3 个池,因此我们有效地将我们的时间步从 4 个降低到了 3 个。
然而,如果我们使用 GlobalMaxPooling1D
,我们将只取该句子(张量)的最大向量,这可能是单词 'live' 的向量表示。
实际上,这就是在 Keras 中如何定义 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())
@ThePassenger [x, y, z]可以理解为一个包含x个元素的“数组”,其中每个元素都是一个具有y行和z列的矩阵。但也可以理解为你有一个具有x行和y列的矩阵,对于每个元素,你都有一个包含z个元素的数组。
池化只是减少张量的一种方法,例如,如果你有一个具有x行和y列的矩阵,应用池化可以给你一个具有x-n行和相同y-m列的矩阵。