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)