【发布时间】:2018-09-27 13:32:49
【问题描述】:
我想用输出元素的附加条件来训练我的神经网络(在 Keras 中)。
一个例子:
- 最小化网络输出
y_pred和y_true之间的损失函数MSE。 - 另外,确保
y_pred的范数小于或等于1。
没有条件,任务就很简单了。
注意:条件不一定是y_pred的向量范数。
如何在 Keras(或 Tensorflow)模型中实现附加条件/限制?
【问题讨论】:
标签: python tensorflow keras
我想用输出元素的附加条件来训练我的神经网络(在 Keras 中)。
一个例子:
y_pred和y_true之间的损失函数MSE。y_pred 的范数小于或等于1。没有条件,任务就很简单了。
注意:条件不一定是y_pred的向量范数。
如何在 Keras(或 Tensorflow)模型中实现附加条件/限制?
【问题讨论】:
标签: python tensorflow keras
原则上,tensorflow(和 keras)不允许您向模型添加硬约束。
您必须将您的不变量(范数
y_norm = tf.norm(y_pred)
norm_loss = tf.where(y_norm > 1, y_norm, 0)
total_loss = mse + norm_loss
查看where 的文档。如果您的预测具有大于 1 的范数,则反向传播会尝试最小化该范数。如果小于等于,这部分的loss就是0,不产生梯度。
但这可能很难优化。您的预测可能会在范数 1 附近波动。也可以添加一个因子:total_loss = mse + 1000* norm_loss。对此要非常小心,这会使优化变得更加困难。
在上面的示例中,上述范数对损失的贡献是线性的。这称为 l1 正则化。你也可以平方它,这将变成 l2-regularization。
在您的具体情况下,您可以发挥创意。为什么不将您的预测和目标标准化为一个(只是一个建议,可能是个坏主意)?
loss = mse(y_pred / tf.norm(y_pred), y_target / np.linalg.norm(y_target)
【讨论】: