在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次可以发生或不能超过的参数将来自数据库中的存储过程,并且由于该值是基于注册结果提供的,虽然它不是绝对的数理统计,但它将被动态地通知。
我不确定函数是否正确,因为它还没有编译,如果你们也看到了错误,可以指出任何错误。
谢谢你的建议!
1条答案
按热度按时间41zrol4v1#
做了这些改变我想你的训练应该能奏效
1.使用实际损失函数编译模型,而不是字符串
1.在组合损失重命名变量中,不要使用与损失函数相同的名称
1.在
fn_quadrant
中,将常量更改为浮点型