使用张量流进行语义分割 - 损失函数中的 ValueError (sparse-softmax)
semantic segmentation with tensorflow - ValueError in loss function (sparse-softmax)
所以,我正在构建一个基于 Marvin Teichmann's tensorflow-fcn
的全卷积网络 (FCN)
我输入的图片数据,暂时是750x750x3的RGB图片。
运行通过网络后,我使用形状为 [batch_size, 750,750,2] 的 logits 计算损失。
这是一个二元分类 - 我这里有 2 个 类,标签中有 [0, 1](形状为 [batch_sizex750x750]。这些进入损失函数,如下:
def loss(logits, labels, num_classes):
with tf.name_scope('loss mine'):
logits = tf.to_float(tf.reshape(logits, [-1, num_classes]))
#CHANGE labels type to int, for sparse_softmax...
labels = tf.to_int64(tf.reshape(labels, [-1]))
print ('shape of logits: %s' % str(logits.get_shape()))
print ('shape of labels: %s' % str(labels.get_shape()))
cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(logits, labels, name='Cross_Entropy')
tf.add_to_collection('losses', cross_entropy)
loss = tf.add_n(tf.get_collection('losses'), name='total_loss')
return loss
这些是重新整形后的 logits 和标签的形状:
shape of logits: (562500, 2)
shape of labels: (562500,)
在这里,它抛出一个 ValueError 说明:
Shapes () and (562500,) are not compatible
完整追溯如下:
File "train.py", line 89, in <module>
loss_train = loss.loss(logits, data.train.labels, 2)
File "/tensorflow-fcn/loss.py", line 86, in loss
loss = tf.add_n(tf.get_collection('losses'), name='total_loss')
File "/tensorflow/lib/python2.7/site-packages/tensorflow/python/ops/gen_math_ops.py", line 88, in add_n
result = _op_def_lib.apply_op("AddN", inputs=inputs, name=name)
File "/tensorflow/lib/python2.7/site-packages/tensorflow/python/ops/op_def_library.py", line 704, in apply_op
op_def=op_def)
File "/tensorflow/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 2262, in create_op
set_shapes_for_outputs(ret)
File "/tensorflow/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 1702, in set_shapes_for_outputs
shapes = shape_func(op)
File "/tensorflow/lib/python2.7/site-packages/tensorflow/python/ops/math_ops.py", line 1557, in _AddNShape
merged_shape = merged_shape.merge_with(input_.get_shape())
File "/tensorflow/lib/python2.7/site-packages/tensorflow/python/framework/tensor_shape.py", line 570, in merge_with
(self, other))
ValueError: Shapes () and (562500,) are not compatible
建议?我对 tf.add_to_collection('losses', cross_entropy)
的实现是错误的吗?
更新:
我试图通过在上面的代码中直接返回 cross_entropy
作为损失来 运行 这个而不对像素求和(或者我认为如此)。
好像有用。 (它现在从训练优化器函数中抛出一个 ValueError
,说明:No gradients provided for any variable
。
假设这更多地与我的权重初始化和正则化有关。
更新 2:
以上内容(关于由于缺少梯度而导致的 ValueError)是微不足道的。如前所述 here,当定义的任何 tf.Variable 对象与正在最小化的损失张量之间没有路径时,通常会遇到此消息。
使用 tf.add_n
的最初问题仍然存在。我假设它与 Graph 集合在 TensorFlow 中的工作机制有关。初始化我的变量后,错误现在显示为:
Shapes () and (?,) are not compatible
关闭。原来损失函数中的代码缺少平均求和。对于遇到此问题的任何其他人,如下修改损失函数,它应该可以正常工作。
cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(logits, labels, name='Cross_Entropy')
cross_entropy_mean = tf.reduce_mean(cross_entropy, name='xentropy_mean')
tf.add_to_collection('losses', cross_entropy_mean)
loss = tf.add_n(tf.get_collection('losses'), name='total_loss')
return loss
所以,我正在构建一个基于 Marvin Teichmann's tensorflow-fcn
的全卷积网络 (FCN)我输入的图片数据,暂时是750x750x3的RGB图片。 运行通过网络后,我使用形状为 [batch_size, 750,750,2] 的 logits 计算损失。
这是一个二元分类 - 我这里有 2 个 类,标签中有 [0, 1](形状为 [batch_sizex750x750]。这些进入损失函数,如下:
def loss(logits, labels, num_classes):
with tf.name_scope('loss mine'):
logits = tf.to_float(tf.reshape(logits, [-1, num_classes]))
#CHANGE labels type to int, for sparse_softmax...
labels = tf.to_int64(tf.reshape(labels, [-1]))
print ('shape of logits: %s' % str(logits.get_shape()))
print ('shape of labels: %s' % str(labels.get_shape()))
cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(logits, labels, name='Cross_Entropy')
tf.add_to_collection('losses', cross_entropy)
loss = tf.add_n(tf.get_collection('losses'), name='total_loss')
return loss
这些是重新整形后的 logits 和标签的形状:
shape of logits: (562500, 2)
shape of labels: (562500,)
在这里,它抛出一个 ValueError 说明:
Shapes () and (562500,) are not compatible
完整追溯如下:
File "train.py", line 89, in <module>
loss_train = loss.loss(logits, data.train.labels, 2)
File "/tensorflow-fcn/loss.py", line 86, in loss
loss = tf.add_n(tf.get_collection('losses'), name='total_loss')
File "/tensorflow/lib/python2.7/site-packages/tensorflow/python/ops/gen_math_ops.py", line 88, in add_n
result = _op_def_lib.apply_op("AddN", inputs=inputs, name=name)
File "/tensorflow/lib/python2.7/site-packages/tensorflow/python/ops/op_def_library.py", line 704, in apply_op
op_def=op_def)
File "/tensorflow/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 2262, in create_op
set_shapes_for_outputs(ret)
File "/tensorflow/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 1702, in set_shapes_for_outputs
shapes = shape_func(op)
File "/tensorflow/lib/python2.7/site-packages/tensorflow/python/ops/math_ops.py", line 1557, in _AddNShape
merged_shape = merged_shape.merge_with(input_.get_shape())
File "/tensorflow/lib/python2.7/site-packages/tensorflow/python/framework/tensor_shape.py", line 570, in merge_with
(self, other))
ValueError: Shapes () and (562500,) are not compatible
建议?我对 tf.add_to_collection('losses', cross_entropy)
的实现是错误的吗?
更新:
我试图通过在上面的代码中直接返回 cross_entropy
作为损失来 运行 这个而不对像素求和(或者我认为如此)。
好像有用。 (它现在从训练优化器函数中抛出一个 ValueError
,说明:No gradients provided for any variable
。
假设这更多地与我的权重初始化和正则化有关。
更新 2:
以上内容(关于由于缺少梯度而导致的 ValueError)是微不足道的。如前所述 here,当定义的任何 tf.Variable 对象与正在最小化的损失张量之间没有路径时,通常会遇到此消息。
使用 tf.add_n
的最初问题仍然存在。我假设它与 Graph 集合在 TensorFlow 中的工作机制有关。初始化我的变量后,错误现在显示为:
Shapes () and (?,) are not compatible
关闭。原来损失函数中的代码缺少平均求和。对于遇到此问题的任何其他人,如下修改损失函数,它应该可以正常工作。
cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(logits, labels, name='Cross_Entropy')
cross_entropy_mean = tf.reduce_mean(cross_entropy, name='xentropy_mean')
tf.add_to_collection('losses', cross_entropy_mean)
loss = tf.add_n(tf.get_collection('losses'), name='total_loss')
return loss