我正在训练一个GRU层,其中输入的长度不一样。因此,我用0.0填充了输入的功能,以使所有序列具有相同的长度。另一方面,只要输入特征向量全为零,我就不想在任何时间步长上为任何样本计算任何损失。例如,在步骤1000,我的批次大小为34,但是此批次的样本数量33和34在步骤1000中缺少数据或特征值。
我发现只要所有后续层或操作都支持Masking()(inputs)
,我们就可以在Keras中使用方法masking
。但是我已经在tensorflow中实现了我的模型。那么Masking()
在张量流中的等效性是什么?
第二,我怎么知道:batch normalization
,conv
层和任何non linear activation
函数在Keras中是否支持masking()
函数?
非常感谢您的帮助!
答案 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_norm
,conv
和non linear activation function
中的掩膜支持,实在是太麻烦了;通常,如果LSTM
的输出为零;然后在输出端带有sigmoid
激活功能的情况下;输出相对于S型函数的输入的导数为output(1 - output)
。因此,当输出为0时,该导数也为零。而且由于反向传播应用链式规则,因此当前样本相对于网络中任何权重参数的梯度也将为0。因此,无需担心支持问题。但是,例如当激活为relu时,就会出现问题,这是在进行反向传播之前,应将梯度显式乘以零(我想)。也许这样做会有所帮助:
final_output = output * mask
然后final_output
相对于output
的导数将为mask => 0或1(任何时间步长;对于任何样本)。然后,将该梯度从激活函数的output
向后传播到其输入...遵循链规则=>在这种情况下,权重不会受到影响。