tensorflow - tensorflow 中 Masking() Keras 函数的等效性是什么?还有batch norm、conv、relu支持Masking吗?

标签 tensorflow keras

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

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

其次,我如何知道:batch normalizationconv 层和任何非线性激活 函数是否支持 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_normconv非线性激活函数 中对掩码的支持;通常,如果 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/

相关文章:

python - 如何将带有 keras 回归器的 scikit-learn 管道保存到磁盘?

machine-learning - 如何绘制 keras 实验的学习曲线?

python - Tensorflow 的 LSTM 输入

tensorflow - 为什么在 Tensorflow 中转换图像时会出现 ValueError ('\' image\' must be fully defined.' )?

tensorflow - 如何在 Keras 中使用 flow_from_directory 重复数据

python - tensorflow 初学者教程 - read_data_sets 失败

python - 预期 input_1 的形状为 (224, 224, 3),但得到的数组的形状为 (400, 401, 3)

python - 识别猫狗: Error in Flattening in Keras Tensorflow

python - 如何获取 tensorflow 中卷积层的值?

python - 没有名为 'scipy.sparse._sparsetools' 的模块