17

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

  1. 我正在使用具有33 个语义类256x256 像素的图像的SiftFlow 数据集
  2. 结果,在使用卷积和反卷积的最后一层,我得到了以下 tensor(array) [256, 256, 33]
  3. 接下来我想应用Softmax并将结果与​​大小为 [256, 256]的语义标签进行比较。

问题: 我是否应该对最后一层应用 mean averaging 或 argmax,使其形状变为[256,256,1],然后循环遍历每个像素并进行分类,就好像我正在分类256x256实例一样?如果答案是肯定的,如何,如果不是,还有哪些其他选择?

4

1 回答 1

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)

在应用以下代码之前来自文档的一些警告:

  • 警告:此操作需要未缩放的 logits,因为它在内部对 logits 执行 softmax 以提高效率。不要用 softmax 的输出调用这个操作,因为它会产生不正确的结果。
  • 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它现在接受任何形状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)
于 2016-05-18T08:30:31.877 回答