【问题标题】:Multiclass U-Net segmentation in TensorFlowTensorFlow 中的多类 U-Net 分割
【发布时间】:2019-01-04 14:44:17
【问题描述】:

我已经看到了这个问题的各种变体,但仍在努力正确地实施它。我有大脑 MRI 图像,带有 4 类(0-背景、1-组织类型 1、2-组织类型 2、3-莫名其妙跳过和 4-组织类型 4...BrATs 数据集)的真实分段掩码)

我实现了一个基本的 U-Net 架构,但在将其扩展到非二进制分类时遇到了麻烦。特别是损失函数。

这是我已经实现的,但我显然忽略了重要的细节:

[...]
output = tf.layers.conv2d_transpose(
conv18,
filters=5,
kernel_size=1,
strides=1,
padding='same',
data_format='channels_last',
activation=None,
use_bias=True,
kernel_initializer=None,
bias_initializer=tf.zeros_initializer(),
kernel_regularizer=tf.contrib.layers.l2_regularizer(reg),
bias_regularizer=None,
activity_regularizer=None,
kernel_constraint=None,
bias_constraint=None,
trainable=True,
name='output',
reuse=None
)

我认为 (0,1,2,3,4) 可能的掩码值的 5 个过滤器是正确的。然后我使用了以下损失函数:

loss = tf.nn.sparse_softmax_cross_entropy_with_logits(
_sentinel=None,
labels=label,
logits=output,
name='cross_ent_loss'
)

return tf.reduce_mean(loss)

logits 将通过上面的输出传递,标签将是我的堆叠掩码图像 [n_batch, x_dim, y_dim, 1]。查看文档,我知道我没有将标签传递给正确的张量。

我是否正确地处理了这件事?如何使用包含在 1 个掩码图像中的多类标签来实现损失?

【问题讨论】:

    标签: python tensorflow conv-neural-network image-segmentation


    【解决方案1】:

    我直接从文档 tf.nn.sparse_softmax_cross_entropy_with_logits 中忽略了一些东西:

    labels:形状为 [d_0, d_1, ..., d_{r-1}] 的张量(其中 r 是标签和结果的等级)和 dtype int32 或 int64。标签中的每个条目必须是 [0, num_classes) 中的索引。当此操作在 CPU 上运行时,其他值将引发异常,并在 GPU 上为相应的损失和梯度行返回 NaN。

    因此将标签更改为形状 [-1]

    label_reshape = tf.reshape(label, [-1])
    

    修好了!

    【讨论】:

      猜你喜欢
      • 2020-06-14
      • 2021-08-26
      • 2019-04-18
      • 2023-03-29
      • 1970-01-01
      • 2019-01-08
      • 1970-01-01
      • 2021-03-08
      • 2021-04-08
      相关资源
      最近更新 更多