Keras - 在嵌入层中使用零填充掩码

3
目标是将每个索引转换为嵌入向量,然后平均所有向量为单个向量。 我必须忽略填充的零! 平均向量应传递到下一层。
这是我的代码:
from keras.layers import Embedding,Input,AveragePooling1D
from keras.models import Model
from keras.preprocessing.text import Tokenizer as Keras_Tokenizer
from keras.preprocessing.sequence import pad_sequences
import numpy as np


embedding_size = 4
vocab_size = 9 + 1
max_sequence_length = 5 


my_input = Input(shape=(max_sequence_length,), name='input')
embedding_layer = Embedding(output_dim=embedding_size, input_dim=vocab_size,input_length=1, mask_zero=True,name='my_embedding')
embedding = embedding_layer(my_input)



avg=AveragePooling1D(pool_size=max_sequence_length)(embedding)#Calc average off all embedding vectors
model = Model(inputs= [my_input], outputs=avg)
model.get_weights() 



aa = np.array([[0,0,2,4]])#sanity checks
model.predict(aa)[0][0] 

并且遇到了这个错误:
TypeError: Layer average_pooling1d_1 does not support masking, but was passed an input_mask: Tensor("my_embedding_9/NotEqual:0", shape=(?, 5), dtype=bool)

有人能提供帮助吗?


将池大小设置为与序列长度相同的情况下,请切换到“平均值”作为您的池。 “平均值”应支持掩码。 - nuric
1
Average函数接受一个张量列表作为输入,但对于当前情况并不适用(请参见此处)。它是一个merge层。我们实际需要的是一个支持掩码的GlobalAveragePooling1D - syltruong
1个回答

0

你的使用情况与这个非常相关。

这将让你编写一个自定义层来支持GlobalAveragePooling1DAveragePooling1D中的掩蔽。


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