phi*_*013 2 python machine-learning keras tensorflow
我需要在 Keras 中创建一个自定义损失函数,并根据条件返回两个不同的损失值的结果。我无法让 if 语句正常运行。
我需要做类似的事情:
def custom_loss(y_true, y_pred):
sees = tf.Session()
const = 2
if (sees.run(tf.keras.backend.less(y_pred, y_true))): #i.e. y_pred - y_true < 0
return const * mean_squared_error(y_true, y_pred)
else:
return mean_squared_error(y_true, y_pred)
Run Code Online (Sandbox Code Playgroud)
尝试运行它时,我不断收到张量错误(见下文)。任何帮助/建议将不胜感激!
InvalidArgumentError: You must feed a value for placeholder tensor 'dense_63_target' with dtype float and shape [?,?]
[[Node: dense_63_target = Placeholder[dtype=DT_FLOAT, shape=[?,?], _device="/job:localhost/replica:0/task:0/device:CPU:0"]()]]
Run Code Online (Sandbox Code Playgroud)
您应该改为简单地乘以掩码以获得所需的功能
import keras.backend as K
def custom_1loss(y_true, y_pred):
const = 2
mask = K.less(y_pred, y_true) #i.e. y_pred - y_true < 0
return (const - 1) * mask * mean_squared_error(y_true, y_pred) + mean_squared_error(y_true, y_pred)
Run Code Online (Sandbox Code Playgroud)
当y_pred具有与预测不足时相同的期望输出时,MSE添加了另一个项。您可能必须将掩码转换为整数张量 - 我不记得具体是什么类型 - 但这将是一个小改动。
也可以作为对您的一般方法的主动建议。我认为你会用不同的损失方法获得更好的结果。
import keras.backend as K
def custom_loss2(y_true, y_pred):
beta = 0.1
return mean_squared_error(y_true, y_pred) + beta*K.mean(y_true - y_pred)
Run Code Online (Sandbox Code Playgroud)
观察梯度行为的差异:
https://www.desmos.com/calculator/uubwgdhpi6
我向您展示的第二个损失函数将局部最小值的时刻转变为次要的过度预测而不是预测不足(基于您想要的)。您给出的损失函数仍然局部优化为 0,但具有不同的强度梯度。这很可能会导致收敛到与 MSE 相同的结果的速度较慢,而不是期望模型会过度预测然后预测不足。我希望这是有道理的。
| 归档时间: |
|
| 查看次数: |
4072 次 |
| 最近记录: |