【问题标题】:U net Multiclass segmentation image input dataset errorU net 多类分割图像输入数据集错误
【发布时间】:2020-11-12 14:06:35
【问题描述】:

我正在尝试使用 U-net 进行多类分割。在之前的试验中,我尝试了二进制分割并且它有效。但是当我尝试做多类时,我遇到了这个错误。

**ValueError: 'generator yielded an element of shape (128,192,1) where an element of shape (128,192,5) was expected**   

这 5 表示班级的数量。这就是我定义输出层的方式。 output:Tensor("output/sigmoid:0",shape(?,128,192,5),dtype=float32).

由于灰度图像,我保留了input_shape:(128,192,1) 的裁剪尺寸 和label_shape:(128,192,5)

数据加载到 tensorflow 数据集中并使用 tf.iterator。 生成器从 tf.dataset 生成数据。

def get_datapoint_generator(self):
  def generator():
   for i in itertools.count(1):
    datapoint_dict=self._get_next_datapoint()
    yield datapoint_dict['image'],datapoint_dict['mask']

_get_next_datapoint_ 函数从 ram 获取下一个数据点,并处理裁剪和扩充。

现在,它与输出形状不匹配会哪里出错?

【问题讨论】:

  • 你应该给标签shape(?,128,192,5)而不是shape(?,128,192,1)。或者你需要改变损失函数和度量函数
  • 这就是我给的label (batch_size, 128,192,5)
  • 你确定吗? @ram 我有点困惑。你能检查一下你的面具的形状吗
  • 我的掩码 datapoint_dict['mask'] 的形状返回 (128,192,3)。我很困惑
  • @CenkBircanoglu 掩码的形状和输出标签的形状应该匹配吗?

标签: python tensorflow tensorflow-datasets multiclass-classification unity3d-unet


【解决方案1】:

你能尝试使用这个实现吗?我正在使用这个,但它在 Keras 中

def sparse_crossentropy(y_true, y_pred):
    nb_classes = K.int_shape(y_pred)[-1]
    y_true = K.one_hot(tf.cast(y_true[:, :, 0], dtype=tf.int32), nb_classes + 1)
    return K.categorical_crossentropy(y_true, y_pred)

【讨论】:

  • 当然我会试试看,但你能解释一下为什么损失会影响这种标签形状吗?
  • 损失函数计算模型输出与标签之间的差异,优化器函数使用该差异来更新模型的权重。所以模型和标签的输出应该是相同的格式。但是您可以对损失函数进行一些更改以支持不同的形状。为了简单起见,如果您正在处理分类问题,如果模型的输出是整数,则标签应该是整数来计算差异,但您也可以使用 one_hot_encoded 标签并通过重塑 y_true 或计算损失函数中的差异y_pred。
  • 嘿thanx 人。即使是正常的分类熵也有效。问题是我在博客中读到,对于像交叉熵这样的损失,标签形状和输出形状是不同的。但我保持不变,这就是为什么
猜你喜欢
  • 2021-03-08
  • 2020-06-14
  • 2021-11-02
  • 1970-01-01
  • 2018-07-28
  • 2022-08-04
  • 2020-09-30
  • 2021-07-05
  • 2019-04-18
相关资源
最近更新 更多