将副条件纳入Keras神经网络

时间:2018-09-27 13:32:50

标签: python tensorflow keras

我想训练我的神经网络(在Keras中),并在输出元素上附加条件。

一个例子:

  • 最小化网络输出y_predy_true之间的损失函数MSE。
  • 另外,确保y_pred的范数小于或等于1。

没有条件,任务就很简单。 注意:条件不一定是y_pred的向量范数。

我如何在Keras(或Tensorflow)模型中实施附加条件/限制?

1 个答案:

答案 0 :(得分:1)

原则上,张量流(和keras)不允许您向模型添加硬约束。

您必须将不变量(范数<= 1)转换为惩罚函数,并将其添加到损失中。看起来可能像这样:

y_norm = tf.norm(y_pred)
norm_loss = tf.where(y_norm > 1, y_norm, 0)
total_loss = mse + norm_loss

查看where的文档。如果您的预测的范数大于一个,则反向传播会尝试将范数最小化。如果小于或等于,则损失的这一部分仅是0。不会产生梯度。

但这很难优化。您的预测可能会在1的范数附近波动。也可以添加一个因素:total_loss = mse + 1000* norm_loss。对此要非常小心,这会使优化更加困难。 在上面的示例中,高于1的范数线性地造成了损失。这称为l1-正则化。您也可以将其平方,这将成为l2正则化。

在您的特定情况下,您可以发挥创造力。为什么不将预测和目标归一化(只是一个建议,可能是个坏主意)?

loss = mse(y_pred / tf.norm(y_pred), y_target / np.linalg.norm(y_target)