有没有办法监控自定义 Keras 后端损失函数的不同子张量?
Is there a way to monitor the different subtensors of a custom Keras backend loss function?
我目前正在通过将其建模为 Keras 后端张量来实现自定义损失函数。损失函数有不同的部分(例如分类损失,量化损失或成对距离损失)
代码看起来像这样:
...
different_class_loss = K.log(1 + K.exp(-1*dissimilarity + margin))
pair_loss = same_class * same_class_loss + (1-same_class) * different_class_loss
loss_value = lambda_pair * pair_loss + lambda_classif * classif_loss + lambda_quant_binary * quantization_loss
# Add loss to model
pairwise_model.add_loss(loss_value)
# Compile without specifying a loss
pairwise_model.compile(optimizer=optimizer_adam)
当我使用 batch_generator 和 pairwise_model.fit() 训练模型时,历史记录恰好包含组合 loss_value 的一个损失参数。出于调试目的,我想单独监控损失函数的每个部分(即量化、分类和成对距离损失),但我不知道如何做。
我尝试使用 K.eval() 或 K.print_tensor() 实现回调以在训练期间检索值,但这没有用。我也无法使用 add_loss 函数添加多个损失指标。
有没有一种方法可以在不编写自定义训练循环的情况下做到这一点?感觉应该有。非常感谢任何帮助。
__________________________________________________
编辑:
根据史努比博士的想法,这是最终为我工作的代码:
...
different_class_loss = K.log(1 + K.exp(-1*dissimilarity + margin))
pair_loss = same_class * same_class_loss + (1-same_class) * different_class_loss
loss_value = lambda_pair * pair_loss + lambda_classif * classif_loss + lambda_quant_binary * quantization_loss
# Add loss to model
pairwise_model.add_loss(loss_value)
# Add additional losses as metrics
pairwise_model.add_metric(pair_loss, name = "pairwise loss")
pairwise_model.add_metric(quantization_loss, name = "quantization loss")
# Compile without specifying a loss or metrics
pairwise_model.compile(optimizer=optimizer_adam)
您可以将它们作为指标传递,如下所示:
def pl():
return pair_loss
pairwise_model.compile(optimizer=optimizer_adam, metrics=[pl])
您可以对其他损失组件执行类似的操作。该函数可能不需要,您也可以尝试将 pair_loss
作为指标直接传递。
我目前正在通过将其建模为 Keras 后端张量来实现自定义损失函数。损失函数有不同的部分(例如分类损失,量化损失或成对距离损失)
代码看起来像这样:
...
different_class_loss = K.log(1 + K.exp(-1*dissimilarity + margin))
pair_loss = same_class * same_class_loss + (1-same_class) * different_class_loss
loss_value = lambda_pair * pair_loss + lambda_classif * classif_loss + lambda_quant_binary * quantization_loss
# Add loss to model
pairwise_model.add_loss(loss_value)
# Compile without specifying a loss
pairwise_model.compile(optimizer=optimizer_adam)
当我使用 batch_generator 和 pairwise_model.fit() 训练模型时,历史记录恰好包含组合 loss_value 的一个损失参数。出于调试目的,我想单独监控损失函数的每个部分(即量化、分类和成对距离损失),但我不知道如何做。
我尝试使用 K.eval() 或 K.print_tensor() 实现回调以在训练期间检索值,但这没有用。我也无法使用 add_loss 函数添加多个损失指标。
有没有一种方法可以在不编写自定义训练循环的情况下做到这一点?感觉应该有。非常感谢任何帮助。
__________________________________________________
编辑:
根据史努比博士的想法,这是最终为我工作的代码:
...
different_class_loss = K.log(1 + K.exp(-1*dissimilarity + margin))
pair_loss = same_class * same_class_loss + (1-same_class) * different_class_loss
loss_value = lambda_pair * pair_loss + lambda_classif * classif_loss + lambda_quant_binary * quantization_loss
# Add loss to model
pairwise_model.add_loss(loss_value)
# Add additional losses as metrics
pairwise_model.add_metric(pair_loss, name = "pairwise loss")
pairwise_model.add_metric(quantization_loss, name = "quantization loss")
# Compile without specifying a loss or metrics
pairwise_model.compile(optimizer=optimizer_adam)
您可以将它们作为指标传递,如下所示:
def pl():
return pair_loss
pairwise_model.compile(optimizer=optimizer_adam, metrics=[pl])
您可以对其他损失组件执行类似的操作。该函数可能不需要,您也可以尝试将 pair_loss
作为指标直接传递。