logits和labels必须是相同大小错误使用SoftmaxCrossEntropyWithLogits

我对Tensorflow完全是新手。我一直在尝试将Deep MNIST教程改编为预测MovieLens数据集的电影评级。我稍微简化了模型,使其不再使用5分制,而是简单的二元Y/N评级(类似于Netflix最新的评级系统)。我试图仅使用部分评级来预测新项目的偏好。在训练模型时,我在堆栈跟踪中得到了以下错误:

Traceback (most recent call last):  File "/Users/Eric/dev/Coding Academy >Tutorials/tf_impl/deep_tf_group_rec_SO.py", line 223, in <module>    train_step.run(feed_dict={x: batch_xs, y_: batch_ys, keep_prob: 0.5})  File "/Library/Python/2.7/site->packages/tensorflow/python/framework/ops.py", line 1550, in run    _run_using_default_session(self, feed_dict, self.graph, session)  File "/Library/Python/2.7/site->packages/tensorflow/python/framework/ops.py", line 3764, in >_run_using_default_session    session.run(operation, feed_dict)  File "/Library/Python/2.7/site->packages/tensorflow/python/client/session.py", line 767, in run    run_metadata_ptr)  File "/Library/Python/2.7/site->packages/tensorflow/python/client/session.py", line 965, in _run    feed_dict_string, options, run_metadata)  File "/Library/Python/2.7/site->packages/tensorflow/python/client/session.py", line 1015, in _do_run    target_list, options, run_metadata)  File "/Library/Python/2.7/site->packages/tensorflow/python/client/session.py", line 1035, in _do_call    raise type(e)(node_def, op, message)tensorflow.python.framework.errors_impl.InvalidArgumentError: logits and >labels must be same size: logits_size=[1,2] labels_size=[50,2]     [[Node: SoftmaxCrossEntropyWithLogits = >SoftmaxCrossEntropyWithLogits[T=DT_FLOAT, >_device="/job:localhost/replica:0/task:0/cpu:0"](Reshape_2, Reshape_3)]]Caused by op u'SoftmaxCrossEntropyWithLogits', defined at:  File "/Users/Eric/dev/Coding Academy >Tutorials/tf_impl/deep_tf_group_rec_SO.py", line 209, in <module>    cross_entropy = >tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_, >logits=y_conv))  File "/Library/Python/2.7/site->packages/tensorflow/python/ops/nn_ops.py", line 1617, in >softmax_cross_entropy_with_logits    precise_logits, labels, name=name)  File "/Library/Python/2.7/site->packages/tensorflow/python/ops/gen_nn_ops.py", line 2265, in >_softmax_cross_entropy_with_logits    features=features, labels=labels, name=name)  File "/Library/Python/2.7/site->packages/tensorflow/python/framework/op_def_library.py", line 763, in >apply_op    op_def=op_def)  File "/Library/Python/2.7/site->packages/tensorflow/python/framework/ops.py", line 2327, in create_op    original_op=self._default_original_op, op_def=op_def)  File "/Library/Python/2.7/site->packages/tensorflow/python/framework/ops.py", line 1226, in __init__    self._traceback = _extract_stack()InvalidArgumentError (see above for traceback): logits and labels must >be same size: logits_size=[1,2] labels_size=[50,2]     [[Node: SoftmaxCrossEntropyWithLogits = >SoftmaxCrossEntropyWithLogits[T=DT_FLOAT, >_device="/job:localhost/replica:0/task:0/cpu:0"](Reshape_2, Reshape_3)]]

导致错误的代码可以在这里查看 here

模型中使用的变量大小:

  • x (?, 1682)

  • y_ (?, 2)

  • x_history (?, 290, 290, 1)
  • h_pool1 (?, 145, 145, 32)
  • h_pool2 (?, 73, 73, 64)
  • h_pool3 (?, 37, 37, 128)
  • h_pool4 (?, 19, 19, 256)
  • h_pool5 (?, 10, 10, 512)
  • h_fc1 (?, 1024)
  • h_fc1_drop (?, 1024)
  • y_conv (?, 2)

回答:

问题出在你将输入批次(形状为50个训练实例 x 1682个特征)重塑为[-1, 290, 290, 1]的这行代码:

x_history = tf.reshape(x, [-1, 290, 290, 1])

你可以通过运行以下代码来查看x_history最终的形状:

x_history.eval(feed_dict={x:batch[0], y_:batch[1], keep_prob:1.0}).shape=> (1, 290, 290, 1)

这实际上是将50个实例的所有特征放入一个单一实例中(第一维度是1,而它需要是50),然后通过网络的其余部分运行。因此,你的交叉熵评估失败了,因为它无法将50个目标标签的批次与网络的单一输出对齐。

你需要选择层形状,以便通过网络保留批次维度(你在形状输出中看到的?)。一种方法是将你的特征填充到1764,然后重塑为[-1,42,42,1],因为42*42 = 1764。

值得注意的是,二维卷积最常用于自然是二维的图像数据。鉴于你的特征不是二维的,你可能最好从一个更简单的全连接层网络开始?

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注