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

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

其次,我如何知道:batch normalizationconv层和任何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_normconvnon 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/

10-11 06:28