我想训练我的神经网络(在Keras中),并在输出元素上附加条件。
一个例子:
y_pred
和y_true
之间的损失函数MSE。y_pred
的范数小于或等于1。没有条件,任务就很简单。
注意:条件不一定是y_pred
的向量范数。
我如何在Keras(或Tensorflow)模型中实施附加条件/限制?
答案 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)