张量流中Masking()Keras函数的等效性是什么?批处理规范,转换和relu是否支持Masking?

时间:2018-08-10 15:04:55

标签: tensorflow keras

我正在训练一个GRU层,其中输入的长度不一样。因此,我用0.0填充了输入的功能,以使所有序列具有相同的长度。另一方面,只要输入特征向量全为零,我就不想在任何时间步长上为任何样本计算任何损失。例如,在步骤1000,我的批次大小为34,但是此批次的样本数量33和34在步骤1000中缺少数据或特征值。

我发现只要所有后续层或操作都支持Masking()(inputs),我们就可以在Keras中使用方法masking。但是我已经在tensorflow中实现了我的模型。那么Masking()在张量流中的等效性是什么?

第二,我怎么知道:batch normalizationconv层和任何non linear activation函数在Keras中是否支持masking()函数?

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

因此,我在danijar博客https://danijar.com/variable-sequence-lengths-in-tensorflow/中找到了详细的解决方案。

序列不完整时,会使用角膜中的遮罩。因此,通常情况下,您需要在第三个维度(要素的维度;当输入维度的形状为[batch_size, sequence_length, num_features]时,用0.0填充序列。然后,keras中的蒙版将采用数字,其遮罩将输出0激活。

总结:他展示了如何使用他实现的length()计算批次中每个样品的序列长度。然后将输出向量馈送到dynamic_rnn中,它将为不完整序列(状态和输出)输出零向量,这在某种程度上类似于Keras Masking()函数中发生的情况。其次,在计算损失函数时,我们应该使用mask

所有详细信息都将在此博客文章中讨论。

但是,对于batch_normconvnon linear activation function中的掩膜支持,实在是太麻烦了;通常,如果LSTM的输出为零;然后在输出端带有sigmoid激活功能的情况下;输出相对于S型函数的输入的导数为output(1 - output)。因此,当输出为0时,该导数也为零。而且由于反向传播应用链式规则,因此当前样本相对于网络中任何权重参数的梯度也将为0。因此,无需担心支持问题。但是,例如当激活为relu时,就会出现问题,这是在进行反向传播之前,应将梯度显式乘以零(我想)。也许这样做会有所帮助:

final_output = output * mask

然后final_output相对于output的导数将为mask => 0或1(任何时间步长;对于任何样本)。然后,将该梯度从激活函数的output向后传播到其输入...遵循链规则=>在这种情况下,权重不会受到影响。