在自定义Keras图层算法中使用遮罩

时间:2019-07-29 04:12:29

标签: python tensorflow keras

我正在尝试编写一个自定义的Keras层以处理单词嵌入序列。即我们有可变长度的单词序列,这些单词被转换为固定长度向量的(可变长度)序列。我知道在Keras中处理此问题的方法是使用Masking。

目标是产生一个接受这些(屏蔽的)序列的图层,并为每个序列输出一个向量,该向量是minmax和{{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函数,但是我认为这在可变长度输入方面不能很好地起作用(除非我遗漏了某些东西...)

感谢您提供的任何帮助,堆栈溢出!

0 个答案:

没有答案