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

标签 python-3.x tensorflow keras conv-neural-network transfer-learning

我目前正在尝试使用在 Imagenet 上训练的 Densenet 进行迁移学习,以输出一个有序整数值 {2 < 3 < 4 < 5 < 6}。我使用 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。

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

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

关于python-3.x - Convnet 序数回归损失函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60133055/

相关文章:

Keras:二值图像分割中的像素类不平衡

python - 检查一个值是否是列表的第一次出现并在 Python 中标记为 1

python - 导入tensorflow使python 3.6.5报错

python - 如何将多个二维数组作为输入传递给 tensorflow 服务 api?

Python/Tensorflow - reshape 的输入是一个具有 92416 个值的张量,但请求的形状需要 2304 的倍数

python - LSTM 上的 Keras 注意力层

python - 如何使用列表理解将二维列表中的值匹配到另一个二维列表?

python - 如何从字典中删除字典中的重复条目?

python-3.x - 无法在 balebot 中使用 time.sleep() 发送一组消息

tensorflow - 关于 Keras 框架下自编码器模型中的解码器层定义