我已经遍历这个问题的各种变体,但仍在努力正确地实施它。我有带有四个类别的地面真相分段蒙版的脑部MRI图像(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)
在其中logit将从上方通过输出,而标签将是我堆叠的蒙版图像[n_batch,x_dim,y_dim,1]。查看文档,我知道我没有传递正确的张量标签。
我什至正确地解决了吗?如何使用1个蒙版图像中包含的多类标签实现损失?
答案 0 :(得分:0)
在文档 tf.nn.sparse_softmax_cross_entropy_with_logits中,我直接忽略了某些事情:
标签:形状为[d_0,d_1,...,d_ {r-1}]的张量(其中r是标签和结果的等级)和dtype int32或int64。标签中的每个条目都必须是[0,num_classes)中的索引。当此op在CPU上运行时,其他值将引发异常,并为GPU上的相应损耗和梯度行返回NaN。
因此将标签更改为[-1]形状
label_reshape = tf.reshape(label, [-1])
解决了!