52

MaxPooling1D 和 GlobalMaxPooling1D 都被描述为时间数据的最大池化操作。

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

我了解 GlobalMaxPooling1D 不接受输入参数。 keras.layers.pooling.GlobalMaxPooling1D()

我只是想直观地了解他们两个在工作方式上的不同之处?

4

2 回答 2

83

GlobalMaxPooling1D时间数据的Td;lr采用步长维度上的最大向量。所以形状为 [10, 4, 10] 的张量在全局池化后变成了形状为 [10, 10] 的张量。MaxPooling1D也采用最大步骤,但限制为每个步幅的 pool_size。所以一个 [10, 4, 10] 张量pooling_size=2stride=1是一个 [10, 3, 10] 之后的张量MaxPooling(pooling_size=2, stride=1)

带有图形辅助的长答案

假设我们有一个包含 4 个单词的简单句子,并且我们对单词进行了一些向量编码(如word2vec嵌入)。当然,您通常不会最大化池并嵌入张量,但这应该是一个例子。全局池也可以跨渠道工作,但我将在此说明中省略它。最后,填充会使事情变得稍微复杂一些,但我们在这里也不需要它。

假设我们有MaxPooling1D(pool_size=2, strides=1).Then

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我们将只取该句子的最大向量(张量),这可能是单词“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())
于 2017-05-02T05:42:30.677 回答
1

@ThePassenger [x, y, z] 可以看作是您有一个带有 x 元素的“数组”,其中每个元素都是一个具有 y 行和 z 列的矩阵。而且因为您有一个矩阵 aith x 行和 y 列,并且对于每个元素,您都有一个 z 元素数组。

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

于 2018-10-16T19:50:01.493 回答