【发布时间】:2018-12-23 23:25:58
【问题描述】:
我想使用 FCN(一种 U-Net)来进行语义分割。
我使用基于 Tensorflow 后端的 Python 和 Keras 执行它。现在我得到了很好的结果,我正在努力改进它们,我认为做这件事的一种方法是改进我的损失计算。
我知道在我的输出中,几个类是不平衡的,使用默认的categorical_crossentropy 函数可能会出现问题。
我的模型输入和输出都是 float32 格式,输入是 channel_first 和 output 和 channel_last (排列在模型末尾完成)
在二进制情况下,当我只想分割一个类时,我以这种方式更改了损失函数,以便它可以根据输出的内容逐个添加权重:
def weighted_loss(y_true, y_pred):
def weighted_binary_cross_entropy(y_true, y_pred):
w = tf.reduce_sum(y_true)/tf_cast(tf_size(y_true), tf_float32)
real_th = 0.5-th
tf_th = tf.fill(tf.shape(y_pred), real_th)
tf_zeros = tf.fill(tf.shape(y_pred), 0.)
return (1.0 - w) * y_true * - tf.log(tf.maximum(tf.zeros, tf.sigmoid(y_pred) + tf_th)) +
(1- y_true) * w * -tf.log(1 - tf.maximum(tf_zeros, tf.sigmoid(y_pred) + tf_th))
return weighted_binary_coss_entropy
请注意,th 是激活阈值,默认情况下为 1/nClasses,我已对其进行了更改,以查看哪个值能给我最好的结果 你怎么看待这件事? 如何改变它,以便能够计算加权分类交叉熵(在多类的情况下)
【问题讨论】:
标签: python tensorflow keras deep-learning