首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在keras中执行逐行或列最大池

如何在keras中执行逐行或列最大池
EN

Stack Overflow用户
提问于 2017-10-23 06:41:33
回答 1查看 1.6K关注 0票数 0

我试图在一个注意层上执行按行和按列的最大池,如下所示:http://www.dfki.de/~neumann/ML4QAseminar2016/presentations/Attentive-Pooling-Network.pdf (幻灯片-15)

我使用文本数据集,其中一个句子被输入到CNN。句子中的每一个字都被嵌入了。其代码如下:

代码语言:javascript
复制
model.add(Embedding(MAX_NB_WORDS, emb_dim, weights=[embedding_matrix],input_length=MAX_SEQUENCE_LENGTH, trainable=False))
model.add(Conv1D(k, FILTER_LENGTH, border_mode = "valid", activation = "relu"))    

CNN的输出是形状的(无,256)。这作为对注意力层的输入。有人能建议如何在以tensorflow为后端的keras中实现逐行或列最大池吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-23 12:55:31

如果您的模型中有形状为(batch, width, height, channels)的图像,则可以重新塑造数据以隐藏空间维度之一,并使用一维池:

宽度的

代码语言:javascript
复制
model.add(Reshape((width, height*channels)))
model.add(MaxPooling1D()) 
model.add(Reshape((width/2, height, channels))) #if you had an odd number, add +1 or -1 (one of them will work) 

表示高度:

代码语言:javascript
复制
#Here, the time distributed will consider that "width" is an extra time dimension, 
#and will simply think of it as an extra "batch" dimension
model.add(TimeDistributed(MaxPooling1D()))

工作示例,函数API模型有两个分支,一个用于每个池:

代码语言:javascript
复制
import numpy as np
from keras.layers import *
from keras.models import *

inp = Input((30,50,4))
out1 = Reshape((30,200))(inp)
out1 = MaxPooling1D()(out1)
out1 = Reshape((15,50,4))(out1)
out2 = TimeDistributed(MaxPooling1D())(inp)

model = Model(inp,[out1,out2])
model.summary()

或者使用Reshape,以防您不想为数字操心:

代码语言:javascript
复制
#swap height and width
model.add(Permute((2,1,3)))

#apply the pooling to width
model.add(TimeDistributed(MaxPooling1D()))

#bring height and width to the correct order
model.add(Permute((2,1,3)))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46883334

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档