【问题标题】:Mask the Loss function for segmantic segmentation in tf keras掩码 tf keras 中语义分割的损失函数
【发布时间】:2020-01-29 16:56:29
【问题描述】:

我有大小为 (256,256) 的图像被分割成 10 个类别(09)。 我想在这个数据集上训练一个语义分割网络,但只想把它当作一个 9 类问题(即忽略类2)。

我的问题是是否有类似掩码的东西我可以解析其中未评估损失的地方。

我目前的做法是: 我是在one hot encoding之前修改图片的对应区域,即:


# change any pixel with value 2 to 255
target = tf.where(target==2,tf.constant(255,shape=(256, 256), dtype=tf.uint8),target) 

# change 3 -> 2, 4 -> 3, ..., 9 -> 8    
for i in range(3,10):
    target = tf.where(target==i,tf.constant(i-1,shape=(256, 256), dtype=tf.uint8),target)

# do one hot
out = tf.one_hot(target,9)

并训练一个具有 9 类输出的网络。曾经具有值2 的所有像素 单热编码为[0,0,0,0,0,0,0,0,0],不应计入损失函数(categorical_crossentropy)。无论如何,我不确定这是否会在我们除以像素数(常数 256^2)时产生问题,并且如果图像的大部分被零向量标记,这将减少其他标签的影响。

我正在使用tf.kerasTensorflow 2.0

【问题讨论】:

    标签: python tensorflow tensorflow2.0 tf.keras


    【解决方案1】:

    我认为您可以在这里使用权重向量来实现您所需要的。

    # Creating a random vector of targets of size (128)
    target = tf.constant(np.random.randint(0,10, size=128).astype(np.int32))
    # Create weights of size (128) and reshape to (128,1)
    weights = tf.cast(tf.not_equal(target, 2), tf.float32)[:,tf.newaxis]
    
    # do one hot and multiply by weights
    out = tf.one_hot(target,9) * weights
    

    话虽如此,这是为了得到一个零向量。但是忽略这些像素的标准方法是将实际的交叉熵损失乘以权重而不是 onehot 向量。

    out = tf.one_hot(target,9)
    # pred is the predictions made
    loss = tf.keras.losses.CategoricalCrossentropy()(out, pred) * weights
    

    这将使损失忽略值为 2 的像素。

    【讨论】:

    • 感谢您的帮助!将损失乘以权重向量是否仍会减少非两个像素的影响?因为最后我们仍然会除以像素总数,如果说权重向量由 90% 的零组成,我们会将 12 个数字相加,但仍除以 128。
    • 为此除以tf.sum(weights) 而不是批量大小。然后你基本上消除了这种影响
    猜你喜欢
    • 2018-11-04
    • 2021-07-30
    • 2017-06-26
    • 2018-10-22
    • 2017-07-24
    • 2022-10-12
    • 2020-04-18
    • 2021-09-23
    • 2021-07-19
    相关资源
    最近更新 更多