Python 秩不匹配:标签的秩(接收2)应等于logits的秩减1(接收2)
我正在构建DNN来预测图像中是否存在该对象。我的网络有两个隐藏层,最后一层如下所示: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') 我成批运行训练(因此输出层形状中的第
# 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)
对于标签,我没有得到pontintf.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))