Keras 中的像素加权损失函数 - TensorFlow 2.0

Posted

技术标签:

【中文标题】Keras 中的像素加权损失函数 - TensorFlow 2.0【英文标题】:Pixel-wise weighted loss function in Keras - TensorFlow 2.0 【发布时间】:2020-07-28 06:04:39 【问题描述】:

我正在尝试为我用 Keras 编写的模型编写逐像素加权损失函数,但在 TensorFlow 2.0 中似乎不再可能,即不可能有除 @ 之外的其他输入的损失函数987654321@和y_pred

我以前是这样写的:

from tensorflow.keras.layers import Input, Conv2D
from tensorflow.keras.optimizers import Adam
from tensorflow.keras import backend as K

def my_keras_model():
  input = Input((256,256,1), name='input')
  weight = Input((256,256,1), name='weights')
  c1 = Conv2D(16, (3, 3), activation='relu', kernel_initializer='glorot_uniform', padding='same')(input)
  outputs = Conv2D(1, (1, 1), activation='sigmoid')(c1)

  model=Model(input=[input,weight], output=outputs)
  model.compile(optimizer=Adam(learning_rate=0.001, name='adam'), loss=my_weighted_loss(weight))
  return model

def my_weighted_loss(weight):    
   def loss(y_true, y_pred):
     return K.mean(weight * K.binary_crossentropy(y_true, y_pred), axis=-1)
   return loss

知道如何在 TF 2 中做到这一点吗?

【问题讨论】:

一种解决方案是禁用急切模式:tf.compat.v1.disable_eager_execution() 【参考方案1】:

实现这一点的一种“hacky”方式是将原始输入添加到输出中,并编写您自己的损失函数。这样就可以了

weight = y_true[...,0]
y_true = y_true[...,1:]

我也很想听到更好的答案:)

【讨论】:

【参考方案2】:

实际上可以实现权重映射并在模型内部进行计算。 既然是二元cross_entropy

model=Model(inputs=[image,weight,mask], outputs=outputs)

如果您使用 tf 数据集,请以这样的方式定义您的模型。

output_types=((tf.float32,tf.float32,tf.float32),tf.float32)
output_shapes=(([1024,1024,1],[1024,1024,1],[1024,1024,1]),[1024,1024,1])

现在计算模型内部的损失函数

bce = y_true * K.log(y_pred+epsilon) + (1-y_true) * K.log(1-y_pred+epsilon) #you have values of y_true also 

这里的模型输出将是这个计算的损失。 如果您需要从模型中进行计算。只需为权重使用 Lambda 层。

weights_out=layers.Lambda(lambda x:x)(weights)

然后也从您的模型中输出该层。所以模型会有 2 个输出来计算元组形式的损失,这样也可以计算像素加权损失。

 model=Model(inputs=[image,weights,mask], outputs=[outputs,weighted_out])

【讨论】:

以上是关于Keras 中的像素加权损失函数 - TensorFlow 2.0的主要内容,如果未能解决你的问题,请参考以下文章

keras中的加权mse自定义损失函数

keras中的加权mse自定义损失函数 - 自定义权重

如何在 keras 中创建自定义损失函数? (自定义加权二元交叉熵)

如何在 Keras 中将损失函数指定为二次加权 kappa?

keras 中像素级二进制分类的最佳损失函数

R Keras 中的自定义损失函数