keras 如何在modulle.compile上使用多个loss函数并保存mse?

pdtvr36n  于 2023-02-12  发布在  其他
关注(0)|答案(1)|浏览(203)

在Python和Keras中使用多个损失函数的正确和优化方法是什么?
我在玩这篇文章:
https://medium.com/@polanitzer/predicting-the-israeli-lottery-results-for-the-november-29-2022-game-using-an-artificial-191489eb2c10
作者使用标准的"MSE"作为损失,我想添加一些更多的自定义函数,这些函数他们没有数学准确性,但只是观察的结果。
假设我有5种情况:
1.以前的结果不会再次发生
1.结果之和必须在V和W之间
1.对于一个从00到99的游戏,我想限制预测的数字从00到49在X中出现的次数(在这个范围内的数字不能超过X次)
1.对于一个从00到99的游戏,我想限制预测的数字在Y中出现的次数从50到99(这个范围内的数字不能超过Y)
1.我想保留默认的mse函数
我的方法从以下几点开始:

    • 情况1**
def fn_never_repeat(y_true, y_pred, previous_data):
    # Compute the difference score between the predicted outputs and the previous data
    diff = K.mean(K.square(y_pred - previous_data), axis=-1)

    # Return the weighted sum of the difference scores
    return diff
    • 情况二**
def fn_sum_values(y_true, y_pred):
    # Calculate the sum of the predicted numbers
    predicted_sum = K.sum(y_pred)
    
    # Set the minimum value to 133 and maximum value to 249
    X = 133
    Y = 249
    
    # Calculate the loss based on the deviation from the desired range (X, Y)
    loss = K.maximum(X - predicted_sum, 0) + K.maximum(predicted_sum - Y, 0)
    
    return loss
    • 情况3和4**(两个象限均使用10作为示例)
def fn_quadrant(y_true, y_pred):
    count_0_to_49 = K.sum(K.cast(K.less(y_pred, 50), 'float'))
    count_50_to_99 = K.sum(K.cast(K.greater_equal(y_pred, 49), 'float'))

    penalty = 0
    if count_0_to_49 > 10:
        penalty += K.square(count_0_to_49 - 10)
    if count_50_to_99 > 10:
        penalty += K.square(count_50_to_99 - 10)

    return K.mean(K.square(y_true - y_pred)) + penalty
    • 情况5**
def fn_combined_loss(y_true, y_pred):
    fn_never_repeat = fn_never_repeat(y_true, y_pred, previous_data)
    fn_sum_values = fn_sum_values(y_true, y_pred)
    fn_quadrant = fn_quadrant(y_true, y_pred)
    mse = K.mean(K.square(y_true - y_pred))
    return  0.25 * fn_never_repeat + 0.25 * fn_sum_values + 0.25 * fn_quadrant + 0.25 * mse

调用它:

model.compile(optimizer=Adam(learning_rate=0.0001), loss='fn_combined_loss', metrics=['accuracy'], custom_objects={'fn_combined_loss': fn_combined_loss})

并且错误发生在:

model.fit(x=x_train, y=y_train, batch_size=number_of_batch, epochs=Nepochs, verbose=1, callbacks=[callbacks_list])

我被这个错误卡住了:
ValueError:未知损失函数:combined_loss_fn。请确保将此对象传递给custom_objects参数。有关详细信息,请访问www.example.com。https://www.tensorflow.org/guide/keras/save_and_serialize#registering_the_custom_object for details.
从最低次数或X次可以发生或不能超过的参数将来自数据库中的存储过程,并且由于该值是基于注册结果提供的,虽然它不是绝对的数理统计,但它将被动态地通知。
我不确定函数是否正确,因为它还没有编译,如果你们也看到了错误,可以指出任何错误。
谢谢你的建议!

41zrol4v

41zrol4v1#

做了这些改变我想你的训练应该能奏效
1.使用实际损失函数编译模型,而不是字符串

model.compile(optimizer=Adam(learning_rate=0.0001),loss=fn_combined_loss,metrics=['accuracy'])

1.在组合损失重命名变量中,不要使用与损失函数相同的名称

def fn_combined_loss(y_true, y_pred):
    fn_never_repeat_ = fn_never_repeat(y_true, y_pred)
    fn_sum_values_ = fn_sum_values(y_true, y_pred)
    fn_quadrant_ = fn_quadrant(y_true, y_pred)
    mse = K.mean(K.square(y_true - y_pred))
    return  0.25 * fn_never_repeat_ + 0.25 * fn_sum_values_ + 0.25 * fn_quadrant_ + 0.25 * mse

1.在fn_quadrant中,将常量更改为浮点型

def fn_quadrant(y_true, y_pred):
    count_0_to_49 = K.sum(K.cast(K.less(y_pred, 50), 'float'))
    count_50_to_99 = K.sum(K.cast(K.greater_equal(y_pred, 49), 'float'))
    penalty = 0.
    if count_0_to_49 > 10:
        penalty += K.square(count_0_to_49 - 10.)
    if count_50_to_99 > 10:
        penalty += K.square(count_50_to_99 - 10.)
    return K.mean(K.square(y_true - y_pred)) + penalty

相关问题