Python 秩不匹配:标签的秩(接收2)应等于logits的秩减1(接收2)

Python 秩不匹配:标签的秩(接收2)应等于logits的秩减1(接收2),python,image-processing,neural-network,tensorflow,conv-neural-network,Python,Image Processing,Neural Network,Tensorflow,Conv Neural Network,我正在构建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') 我成批运行训练(因此输出层形状中的第

我正在构建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')
我成批运行训练(因此输出层形状中的第一个参数是None)

我使用以下损失函数:

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)

我想我应该重塑标签层,但不确定它期望什么。我抬头一看,上面写着:

罗吉斯:秩r和形状[d_0,d_1,…]的未标度对数概率。。。, d{r-2},num_classes]和数据类型float32或float64。标签:张量 形状[d_0,d_1,…,d_{r-2}]和数据类型int32或int64。中的每个条目 标签必须是[0,num_类)中的索引


如果我只有一个类,我的标签应该是什么样的(现在只有0或1)?感谢文档*中对
tf.nn.sparse\u softmax\u cross\u entropy\u和\u logits的任何帮助:

“一个常见的使用案例是具有形状[批次大小, num_classes]和形状[batch_size]的标签。但尺寸更高 支持。”

因此,我假设您的标签张量应为shape
[None]
。请注意,具有shape
[None,1]
或shape
[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\u cross\u entropy\u和\u logits而不是稀疏的\u softmax。这将解决问题。

简而言之,下面是它的实现

    cost = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(
            logits=hypothesis,labels=tf.argmax(Y,1)))

计算Logit和标签之间的稀疏softmax交叉熵

测量离散分类任务中的概率误差 哪些类是相互排斥的(每个条目都在 一节课)

例如,每个CIFAR-10图像都标有一个且只有一个 标签:图像可以是狗或卡车,但不能两者都是

注:对于该操作,给定标签的概率为 被认为是排他性的。也就是说,软类是不允许的, 标签向量必须为 每行logit(每个minibatch条目)的true类

对于概率分布为的软softmax分类 对于每个条目,请参见带有登录的softmax交叉熵

警告:此op需要无标度的Logit,因为它执行softmax 在内部登录以提高效率。不要使用 softmax的输出,因为它将产生不正确的结果

一个常见的用例是具有shape[批大小,num\u类]的logit 和形状为[batch_size]的标签,但支持更高的维度

请注意,为避免混淆,只需传递命名 此函数的参数

计算登录和标签之间的softmax交叉熵。(已弃用)

此函数已弃用。它将在将来的版本中删除

更新说明:

TensorFlow的未来主要版本将允许渐变流入 默认情况下,标签在backprop上输入。将发生反向传播 仅进入logits。计算允许的交叉熵损失 反向传播到logits和Label中,请参见softmax\u cross\u熵与\u logits\u v2

测量离散分类任务中的概率误差 这些类相互排斥(每个条目正好位于一个 类)

例如,每个CIFAR-10图像都标有一个且只有一个 标签:图像可以是狗或卡车,但不能两者都是

这里是softmax\u cross\u entropy\u与\u logits\u v2的相同实现


我已经尝试过了,但后来我遇到了另一个错误:无法为Tensor u'Output:0'提供shape(44,1)的值,该Tensor u'Output:0'具有shape“(?,)”。其中44是我的批大小。我猜这意味着您正在将带有shape(44,1)的labels numpy数组提供给带有shape(?,)的占位符Tensor。因此,请尝试使用labels展平标签numpy数组。展平()这将把(44,1)变成(44,)为什么
tf.argmax(Y,1)
对于标签,我没有得到pontin
tf.nn.sparse\u softmax\u cross\u entropy\u with_logits
我们不需要使用一个热编码,那么我想知道为什么在这里使用argmax Y和1,为什么不直接提供Y?为什么应该>“一个常见的用例是有形状的logits[batch\u size,num\u classes]和形状标签[batch\u size]。但支持更高的维度。”在包括和在内的许多教程中,标签具有大小
[None,10]
,登录具有大小
[None,10]
同样如此。在这种情况下,您应该将tf.nn.softmax\u cross\u entropy\u与\u logits一起使用,而不是tf.nn.sparse\u softmax\u cross\u entropy\u与\u logits一起使用
    cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(
            logits=hypothesis,labels=Y))