具有条件 return 值的自定义损失
Custom loss with conditional return value
我想要一个带有这种正则化的损失函数:对于每个预测,如果预测点的范数低于 0.9 或大于 1,我想应用正则化。
所以我写了这个:
def custom_loss(y_true, y_pred):
ret = keras.losses.mean_squared_error(y_true, y_pred)
n = tf.norm(y_pred, axis = 1)
intern_circle_distance = n - 0.9
return tf.where(tf.logical_and(tf.greater(intern_circle_distance, 0),
tf.less(intern_circle_distance, 0.1))
ret,
ret*2)
当我在model.compile中使用这个时,返回错误:
形状必须具有相同的等级,但对于 'loss_71/Hyper_loss/Select'(运算符:'Select'),形状必须为 0 和 1,输入形状:[?]、[]、[].
我尝试了 keras 环境之外的损失,它似乎有效。
例如:
a = tf.constant([[-1.0, 1.5]])
n = a - 1
K.eval(tf.where(tf.logical_and(tf.greater(n, 0)),
tf.less(n, 2)),
a, a*2))
returns 我张量 [-2., 1.5]
为什么它在keras损失函数之外起作用而在keras损失函数内部不起作用?
它如何在 keras 损失函数中工作?
keras.losses.mean_squared_error
给你一个标量数,所有平方误差的平均值。如果你想改变每个例子的误差计算,那么做这样的事情:
def custom_loss(y_true, y_pred):
diff = tf.squared_difference(y_true, y_pred)
n = tf.norm(y_pred, axis=1)
intern_circle_distance = n - 0.9
diff_reg = tf.where((intern_circle_distance > 0) & (intern_circle_distance <0.1))
diff, 2 * diff)
return tf.reduce_mean(diff_reg)
我想要一个带有这种正则化的损失函数:对于每个预测,如果预测点的范数低于 0.9 或大于 1,我想应用正则化。
所以我写了这个:
def custom_loss(y_true, y_pred):
ret = keras.losses.mean_squared_error(y_true, y_pred)
n = tf.norm(y_pred, axis = 1)
intern_circle_distance = n - 0.9
return tf.where(tf.logical_and(tf.greater(intern_circle_distance, 0),
tf.less(intern_circle_distance, 0.1))
ret,
ret*2)
当我在model.compile中使用这个时,返回错误:
形状必须具有相同的等级,但对于 'loss_71/Hyper_loss/Select'(运算符:'Select'),形状必须为 0 和 1,输入形状:[?]、[]、[].
我尝试了 keras 环境之外的损失,它似乎有效。 例如:
a = tf.constant([[-1.0, 1.5]])
n = a - 1
K.eval(tf.where(tf.logical_and(tf.greater(n, 0)),
tf.less(n, 2)),
a, a*2))
returns 我张量 [-2., 1.5]
为什么它在keras损失函数之外起作用而在keras损失函数内部不起作用? 它如何在 keras 损失函数中工作?
keras.losses.mean_squared_error
给你一个标量数,所有平方误差的平均值。如果你想改变每个例子的误差计算,那么做这样的事情:
def custom_loss(y_true, y_pred):
diff = tf.squared_difference(y_true, y_pred)
n = tf.norm(y_pred, axis=1)
intern_circle_distance = n - 0.9
diff_reg = tf.where((intern_circle_distance > 0) & (intern_circle_distance <0.1))
diff, 2 * diff)
return tf.reduce_mean(diff_reg)