我正在训练输入长度不同的 GRU 层。因此,我用 0.0 填充了输入的特征,使所有序列的长度相同。另一方面,只要输入特征向量全为零,我不想在任何时间步计算任何样本的任何损失。例如,在时间步长为 1000 时,我的批量大小为 34,但该批处理的样本编号 33 和 34 在时间步长为 1000 时缺少数据或特征值。
我发现我们可以在 Keras 中使用 Masking()(inputs)
方法,只要所有后续层或操作都支持 masking
。但是我已经在 tensorflow 中实现了我的模型。那么tensorflow中Masking()
的等价物是什么?
其次,我如何知道:batch normalization
、conv
层和任何非线性激活
函数是否支持 Keras 中的 masking()
函数?
非常感谢您的帮助!!
最佳答案
于是在danijar博客中找到了详细的解决方案https://danijar.com/variable-sequence-lengths-in-tensorflow/ .
当序列不完整时,使用 keras 中的掩码。所以通常,你需要在第三个维度(特征的维度;当输入维度具有 shape = [batch_size, sequence_length, num_features]
)中用 0.0 填充你的序列。之后,keras 中的掩码将取一个数字,将为它们的激活输出 0。
总结:他展示了如何使用他实现的 length()
计算批处理中每个样本的序列长度。然后将输出向量送入 dynamic_rnn
,它将为不完整序列(状态和输出)输出零向量,这在某种程度上类似于 Keras Masking()
中发生的情况功能。其次,我们应该在计算损失函数时使用mask
。
所有细节都在这篇博文中讨论。
但是关于在batch_norm
、conv
和非线性激活函数
中对掩码的支持;通常,如果 LSTM
的输出为零;然后如果输出有 sigmoid
激活函数;输出关于 sigmoid 函数输入的导数是 output(1 - output)
。因此,当输出为 0 时,该导数也为零。由于反向传播应用了链式法则,因此当前样本相对于网络中任何权重参数的梯度也将为 0。因此,无需担心支持问题......但是当激活是 relu 时问题就出现了,例如,在进行反向传播之前,梯度应该明确地乘以零(我猜)。也许做这样的事情会有所帮助:
final_output = output * mask
然后 final_output
相对于 output
的导数将是掩码 => 0 或 1(任何时间步;对于任何样本)。然后,将此梯度从激活函数的 output
反向传播到其输入...后跟链式法则 => 在这种情况下权重不会受到影响。
关于tensorflow - tensorflow 中 Masking() Keras 函数的等效性是什么?还有batch norm、conv、relu支持Masking吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51789338/