2024-05-20 00:55:34 发布
网友
我想用输出元素的附加条件来训练我的神经网络(Keras)
举个例子:
y_pred
y_true
如果没有条件,任务就很简单。 注:条件不一定是y_pred的向量范数
如何在Keras(或Tensorflow)模型中实现附加条件/限制
原则上,tensorflow(和keras)不允许向模型添加硬约束
必须转换不变量(norm<;=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正则化
total_loss = mse + 1000* norm_loss
在你的特殊情况下,你可以发挥创造力。为什么不把你的预测和目标标准化为一个呢(只是一个建议,可能是个坏主意)
loss = mse(y_pred / tf.norm(y_pred), y_target / np.linalg.norm(y_target)
原则上,tensorflow(和keras)不允许向模型添加硬约束
必须转换不变量(norm<;=1) 一个惩罚函数,它被加到损失中。可能是这样的:
看看where的文档。如果你的预测有一个范数大于一,反向传播尝试最小化范数。如果它小于或等于,这部分损失就是0。没有梯度产生
但这很难优化。你的预测可能会在1的范数附近波动,也可以加上一个因子:
total_loss = mse + 1000* norm_loss
。要非常小心,这会使优化更加困难。 在上面的例子中,高于1的范数与损失成线性关系。这称为l1正则化。你也可以平方它,这将成为l2正则化在你的特殊情况下,你可以发挥创造力。为什么不把你的预测和目标标准化为一个呢(只是一个建议,可能是个坏主意)
相关问题 更多 >
编程相关推荐