Keras的MaxPooling1D和GlobalMaxPooling1D功能有什么区别?

Kay*_*Bay 41 keras max-pooling

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

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

我知道GlobalMaxPooling1D没有输入参数. keras.layers.pooling.GlobalMaxPooling1D()

我想直观地了解他们两个人的工作方式有何不同?

ors*_*ady 64

GlobalMaxPooling1D时间数据的Td; lr采用步长维上的最大向量.因此,在全局汇集之后,具有形状[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.
Run Code Online (Sandbox Code Playgroud)

因此,这将产生[1,3,3]张量,每个时间步长是2D池的最大值.由于我们有3个游泳池,因此我们有效地将时间步长从4减少到3.

但是,如果我们使用,GlobalMaxPooling1D我们将只取该句子的最大向量(Tensor),这可能是"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)
Run Code Online (Sandbox Code Playgroud)

希望有所帮助,请让我澄清任何事情.

此外,这是一个你可以玩的例子:

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())
Run Code Online (Sandbox Code Playgroud)

  • 这是一个很好的解释。非常感谢! (2认同)
  • K.max() 如何作用于两个向量?通过比较标准? (2认同)