我正在训练一个GRU层,其中输入的长度不一样。因此,我用0.0填充了输入的功能,以使所有序列具有相同的长度。另一方面,只要输入特征向量全为零,我就不想在任何时间步长上为任何样本计算任何损失。例如,在时间步骤1000,我的批次大小为34,但是此批次的样本数量33和34在时间步骤1000中缺少数据或特征值。
我发现只要所有后续层或操作都支持Masking()(inputs)
,就可以在Keras中使用方法masking
。但是我已经在tensorflow中实现了我的模型。那么在张量流中Masking()
的等价是什么?
其次,我如何知道:batch normalization
,conv
层和任何non linear activation
函数在Keras中是否支持masking()
函数?
非常感谢您的帮助!!
最佳答案
因此,我在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
反向传播到其输入...遵循链规则=>在这种情况下,权重不会受到影响。关于tensorflow - tensorflow 中Masking()Keras函数的等效性是什么?批处理规范,转换和relu是否支持Masking?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51789338/