如何在TensorFlow中实现场景标注的逐像素分类?

时间:2016-02-10 13:49:54

标签: computer-vision classification tensorflow scene labeling

我正在使用 Google的TensorFlow 开展深度学习模式。该模型应用于细分和标记场景

  1. 我正在使用 SiftFlow数据集,它具有 33语义 类 256x256像素的图像
  2. 结果,在我使用卷积和反卷积的最后一层,我得到了以下张量(数组) [256,256,33]
  3. 接下来我想 应用 Softmax 并将结果与​​大小的语义标签进行比较 [256,256]
  4. 问题: 我应该将均值平均值或argmax应用于我的最后一层,使其形状变为 [256,256,1] ,然后循环遍历每个像素并进行分类,好像我正在对 256x256 实例进行分类?如果答案是肯定的,那么,如果没有,还有什么其他选择?

1 个答案:

答案 0 :(得分:12)

要应用softmax并使用交叉熵损失,您必须保持完整您的网络的最终输出 batch_size x 256 x 256 x 33 。因此,无法使用平均值或argmax,因为它会破坏网络的输出概率。

您必须循环遍历所有 batch_size x 256 x 256 像素,并对此像素的预测应用交叉熵损失。使用内置函数tf.nn.sparse_softmax_cross_entropy_with_logits(logits, labels)很容易。

在应用以下代码之前发出一些警告from the doc

  • 警告:此操作需要未缩放的logits ,因为它在内部执行logmax以提高效率。不要使用softmax的输出调用此op,因为它会产生不正确的结果。
  • logits,必须具有[batch_size,num_classes]和dtype(float32或float64)的形状。
  • 标签必须具有[batch_size]形状和dtype int64。

诀窍是使用batch_size * 256 * 256作为函数所需的批量大小。我们会将logitslabels重新整理为此格式。 这是我使用的代码:

inputs = tf.placeholder(tf.float32, [batch_size, 256, 256, 3])  # input images
logits = inference(inputs)  # your outputs of shape [batch_size, 256, 256, 33] (no final softmax !!)
labels = tf.placeholder(tf.float32, [batch_size, 256, 256])  # your labels of shape [batch_size, 256, 256] and type int64

reshaped_logits = tf.reshape(logits, [-1, 33])  # shape [batch_size*256*256, 33]
reshaped_labels = tf.reshape(labels, [-1])  # shape [batch_size*256*256]
loss = sparse_softmax_cross_entropy_with_logits(reshaped_logits, reshaped_labels)

然后,您可以针对该损失应用优化程序。

更新:v0.10

tf.sparse_softmax_cross_entropy_with_logits的{​​{3}}表示它现在接受logits的任何形状,因此无需重新设定张量(感谢@chillinger):

inputs = tf.placeholder(tf.float32, [batch_size, 256, 256, 3])  # input images
logits = inference(inputs)  # your outputs of shape [batch_size, 256, 256, 33] (no final softmax !!)
labels = tf.placeholder(tf.float32, [batch_size, 256, 256])  # your labels of shape [batch_size, 256, 256] and type int64

loss = sparse_softmax_cross_entropy_with_logits(logits, labels)