![](/img/trans.png)
[英]ValueError: Shape mismatch: The shape of labels (received (1,)) should equal the shape of logits except for the last dimension (received (10, 30))
[英]Rank mismatch: Rank of labels (received 2) should equal rank of logits minus 1 (received 2)
我正在构建DNN来预测图像中是否存在对象。 我的网络有两个隐藏层,最后一层看起来像这样:
# Output layer
W_fc2 = weight_variable([2048, 1])
b_fc2 = bias_variable([1])
y = tf.matmul(h_fc1, W_fc2) + b_fc2
然后我有标签的占位符:
y_ = tf.placeholder(tf.float32, [None, 1], 'Output')
我分批进行训练(因此输出图层形状中的第一个参数为无)。
我使用以下损失函数:
cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(
y[:, :1], y_[:, :1], name='xentropy')
loss = tf.reduce_mean(cross_entropy, name='xentropy_mean')
predict_hand = tf.greater(y, 0.5)
correct_prediction = tf.equal(tf.to_float(predict_hand), y_)
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
但在运行时我收到以下错误:
等级不匹配:标签等级(收到2)应等于对数等级减1(接收2)。
我想我应该重塑标签层,但不确定它的期望。 我查阅了文档 ,它说:
logits:秩r和形状[d_0,d_1,...,d_ {r-2},num_classes]和dtype float32或float64的非标定日志概率。 标签:形状张量[d_0,d_1,...,d_ {r-2}]和dtype int32或int64。 标签中的每个条目必须是[0,num_classes)中的索引。
如果我只有一个单独的类,我的标签应该是什么样的(现在它只是0或1)? 任何帮助赞赏
来自tf.nn.sparse_softmax_cross_entropy_with_logits
的文档*:
“常见的用例是对形状[batch_size,num_classes]和形状标签[batch_size]进行记录。但支持更高的尺寸。”
所以我认为你的标签张量应该是形状[None]
。 请注意,具有形状[None, 1]
或形状[None]
的给定张量将包含相同数量的元素。
具有具体虚拟值的示例输入:
>>> logits = np.array([[11, 22], [33, 44], [55, 66]])
>>> labels = np.array([1, 0, 1])
如果小批量中有3个示例,则第一个示例的logits
为11和22,并且有2个类:0和1。
问题可能是网络中的激活功能。 使用tf.nn.softmax_cross_entropy_with_logits而不是sparse_softmax。 这将解决问题。
简而言之,这是它的实现
cost = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(
logits=hypothesis,labels=tf.argmax(Y,1)))
sparse_softmax_cross_entropy_with_logits
计算logits和标签之间的稀疏softmax交叉熵 。
测量离散分类任务中的概率误差,其中类是互斥的 (每个条目恰好在一个类中)。
例如,每个CIFAR-10图像都标有一个且只有一个标签:图像可以是狗或卡车,但不是两者。
注意:对于此操作, 给定标签的概率被视为独占 。 也就是说, 不允许使用软类 ,并且标签向量必须为每行logits(每个小批量条目)的真实类提供单个特定索引 。
对于具有每个条目的概率分布的 软softmax分类 ,请参阅softmax_cross_entropy_with_logits 。
警告:此操作需要未缩放的日志,因为它在内部执行logmax以提高效率。 不要使用softmax的输出调用此op,因为它会产生不正确的结果。
常见的用例是使用shape [batch_size,num_classes]和shape [batch_size]标签的logits。 但支持更高的尺寸。
请注意,为避免混淆,需要仅将命名参数传递给此函数。
softmax_cross_entropy_with_logits_v2和softmax_cross_entropy_with_logits
计算logits和标签之间的softmax交叉熵。 (废弃)
这个功能已被弃用。 它将在以后的版本中删除。
更新说明:
TensorFlow的未来主要版本将允许渐变在默认情况下流入backprop上的标签输入。 反向传播只会发生在logits中。 要计算允许反向传播到logits和标签的交叉熵损失,请参阅softmax_cross_entropy_with_logits_v2
测量离散分类任务中的概率误差,其中类是互斥的(每个条目恰好在一个类中)。
例如,每个CIFAR-10图像都标有一个且只有一个标签:图像可以是狗或卡车,但不是两者。
这是softmax_cross_entropy_with_logits_v2的相同实现
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(
logits=hypothesis,labels=Y))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.