Keras的MaxPooling1D和GlobalMaxPooling1D函数有什么区别?

54

MaxPooling1D和GlobalMaxPooling1D都是用于时间序列数据的最大池化操作。

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

我理解GlobalMaxPooling1D不需要输入参数。keras.layers.pooling.GlobalMaxPooling1D()

我只想直观地了解它们在工作方式上的区别。

2个回答

87

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

3
很好的解释。非常感谢! - KayBay
什么是[x,y,z]张量?我对张量很陌生。我知道它是一个三维线性关系对象。那么池是什么?在这种情况下,它读取的单词数量是吗?如果解释太长,请毫不犹豫地将我重定向到链接或教程。 - Revolucion for Monica
2
K.max()在两个向量上是如何工作的?通过比较范数吗? - Wei

1

@ThePassenger [x, y, z]可以理解为一个包含x个元素的“数组”,其中每个元素都是一个具有y行和z列的矩阵。但也可以理解为你有一个具有x行和y列的矩阵,对于每个元素,你都有一个包含z个元素的数组。

池化只是减少张量的一种方法,例如,如果你有一个具有x行和y列的矩阵,应用池化可以给你一个具有x-n行和相同y-m列的矩阵。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接