python-3.x - Convnet 序数回归损失函数

我目前正在尝试使用在 Imagenet 上训练的 Densenet 进行迁移学习,以输出一个有序整数值 {2 this method 将目标变量编码为长度为 4 的二进制向量(即 [1,0,0,0]、[1,1,0,0] 等)。 .下面是我的模型的架构:

base_model = DenseNet121(include_top=False, weights="imagenet", classes=5, input_shape=(224,224,3))
base_model.trainable = False
x = base_model.output
x = GlobalAveragePooling2D()(x)
x = Dropout(0.8)(x)
preds = Dense(4, activation="sigmoid", 
axis=1),
             )(x)
model = Model(inputs=base_model.input, outputs=preds, name = "ordered_logit")

model.compile(optimizer=keras.optimizers.Nadam(), loss='binary_crossentropy', metrics=[soft_acc_multi_output])

'soft_acc_multi_output' 是我的自定义指标,如果所有条目都匹配真实值,则输出 1,否则输出 0。

import tensorflow.keras.backend as K
def soft_acc_multi_output(y_true, y_pred):
    return K.mean(K.all(K.equal(K.cast(K.round(y_true),'int32'), K.cast(K.round(y_pred),'int32')),axis=1))

我目前正在使用“binary_crossentropy”,但我意识到它并没有告诉模型,如果真正的标签是 [1,1,0,0],那么 [0.9, 0.7, 0, 0.6] 应该比 [0.9, 0.7, 0.6, 0] 受到更严重的惩罚,但目前对它们的惩罚是相同的。我应该如何修改损失函数以使其能够识别这种差异?

最佳答案

当我们需要使用可用的损失函数(或度量)以外的损失函数(或指标)时,我们需要构建自己的自定义损失函数并传递给 model.compile。

度量函数类似于损失函数,只是在训练模型时不使用度量​​的评估结果。我们可以使用任何损失函数作为度量函数。

因此构建一个自定义损失函数,使用您为指标评估构建的计算来确定模型要优化的额外惩罚或损失。

https://stackoverflow.com/questions/60133055/

相关文章:

javascript - 雅格斯 : access processed argv in fail f

flutter - 从一个选项卡更改为另一个选项卡时,所有选项卡都会不断重建

sql-server - 启动SSIS包时不支持包部分调试

c# - Blazor 在 X 量空闲时间后做某事

node.js - Lambda 失败并显示 "Cannot find module..."

amazon-web-services - AWS Lambda 不等待代码上传到 Terrafor

google-cloud-functions - ingressSettings = ALLOW_I

swift - PHPhotoLibrary 出错,无法保存视频

graphql - Apollo Graphql : Rename schema for backw

C# - 检查是否可以访问/读取文件夹