我正在尝试编写一个自定义的Keras层以处理单词嵌入序列。即我们有可变长度的单词序列,这些单词被转换为固定长度向量的(可变长度)序列。我知道在Keras中处理此问题的方法是使用Masking。
目标是产生一个接受这些(屏蔽的)序列的图层,并为每个序列输出一个向量,该向量是min
,max
和{{1}的串联}在该序列中的所有条目中。因此,如果输入形状为mean
,则输出大小将为(batch_size, sequence_length, embedding_dim)
。
到目前为止,我有以下代码,该代码尚未考虑屏蔽:
(batch_size, 3 * embedding_dim)
我发现this answer提出了一种处理“均值”部分的方法,但是我不知道是否可以保证class MinMaxMean(Layer):
def __init__(**kwargs):
super(MinMaxMean, self).__init__(**kwargs)
self.input_spec = InputSpec(ndim=3)
# self.supports_masking = True # Can't deal with this yet...
def build(self, input_shape):
assert len(input_shape) == 3
embedding_dim = input_shape[-1]
self.input_spec = InputSpec(ndim=3, axes={-1: embedding_dim})
self.built = True
def call(self, inputs, mask=None):
# Ideally I was hoping for something like:
# inputs = inputs[mask]
# But sadly that doesn't seem to be how this works...
min = K.min(inputs, axis=1)
max = K.max(inputs, axis=1)
mean = K.mean(inputs, axis=1)
output = K.concatenate((min, max, mean), axis=1)
return output
def compute_output_shape(self, input_shape):
assert input_shape and len(input_shape) == 3
assert input_shape[-1]
output_shape = (input_shape[0], 3*input_shape[-1])
return tuple(output_shape)
中提供的值将包含小于0的值,因此我不知道所提供的方法是否适用于“最小”部分(我想对于“最大”部分在技术上反之亦然)。
到目前为止,我发现的唯一另一个选项是inputs
函数,但是我认为这在可变长度输入方面不能很好地起作用(除非我遗漏了某些东西...)
感谢您提供的任何帮助,堆栈溢出!