【问题标题】:ValueError: logits and targets must have the same shape (tf.learn, DNNLinearCombinedClassifier)ValueError:logits 和目标必须具有相同的形状(tf.learn,DNNLinearCombinedClassifier)
【发布时间】:2016-11-04 13:03:00
【问题描述】:

我正在尝试在我自己的数据集上训练 'Wide & Deep Learning' 模型,当我将模型拟合到训练集时会出现此错误。

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-15-8f5351c1fdf8> in <module>()
----> 1 m.fit(input_fn=train_input_fn, steps=200)

/Users/prisma/anaconda/lib/python2.7/site-packages/tensorflow/contrib/learn/python/learn/estimators/estimator.pyc in fit(self, x, y, input_fn, steps, batch_size, monitors, max_steps)
331                              steps=steps,
332                              monitors=monitors,
--> 333                              max_steps=max_steps)
334     logging.info('Loss for final step: %s.', loss)
335     return self

/Users/prisma/anaconda/lib/python2.7/site-packages/tensorflow/contrib/learn/python/learn/estimators/estimator.pyc in _train_model(self, input_fn, steps, feed_fn, init_op, init_feed_fn, init_fn, device_fn, monitors, log_every_steps, fail_on_nan_loss, max_steps)
660       features, targets = input_fn()
661       self._check_inputs(features, targets)
--> 662       train_op, loss_op = self._get_train_ops(features, targets)
663 
664       # Add default monitors.

/Users/prisma/anaconda/lib/python2.7/site-packages/tensorflow/contrib/learn/python/learn/estimators/dnn_linear_combined.pyc in _get_train_ops(self, features, targets)
188     logits = self._logits(features, is_training=True)
189     if self._enable_centered_bias:
--> 190       centered_bias_step = [self._centered_bias_step(targets, features)]
191     else:
192       centered_bias_step = []

/Users/prisma/anaconda/lib/python2.7/site-packages/tensorflow/contrib/learn/python/learn/estimators/dnn_linear_combined.pyc in _centered_bias_step(self, targets, features)
272     with ops.name_scope(None, "centered_bias", (targets, features)):
273       training_loss = self._target_column.training_loss(
--> 274           logits, targets, features)
275     # Learn central bias by an optimizer. 0.1 is a convervative lr for a
276     # single variable.

/Users/prisma/anaconda/lib/python2.7/site-packages/tensorflow/contrib/layers/python/layers/target_column.pyc in training_loss(self, logits, target, features, name)
204     """
205     target = target[self.name] if isinstance(target, dict) else target
--> 206     loss_unweighted = self._loss_fn(logits, target)
207 
208     weight_tensor = self.get_weight_tensor(features)

/Users/prisma/anaconda/lib/python2.7/site-packages/tensorflow/contrib/layers/python/layers/target_column.pyc in _log_loss_with_two_classes(logits, target)
387     target = array_ops.expand_dims(target, dim=[1])
388   loss_vec = nn.sigmoid_cross_entropy_with_logits(logits,
--> 389                                                   math_ops.to_float(target))
390   return loss_vec
391 

/Users/prisma/anaconda/lib/python2.7/site-packages/tensorflow/python/ops/nn.pyc in sigmoid_cross_entropy_with_logits(logits, targets, name)
432     except ValueError:
433       raise ValueError("logits and targets must have the same shape (%s vs %s)"
--> 434                        % (logits.get_shape(), targets.get_shape()))
435 
436     # The logistic loss formula from above is

ValueError: logits and targets must have the same shape ((?, 1) vs (13647309, 24))

我无法弄清楚为什么 logits 的形状是 (?,1) 而不是 (13647309, 24)。 input_fn 函数应该返回一个大小为 (13647309, 24) 的特征字典和一个形状为 (13647309, 24) 的标签张量。就我而言,logits 应该是模型的输出,但是 DNNLinearCombinedClassifier 中没有指定输出大小的位置,因此我假设输出大小会自动调整为与标签大小相同,即 (13647309, 24)。我不知道为什么会出现这个错误,但我猜我的模型有问题。由于整个代码太长无法粘贴,这里只粘贴模型构建部分。

model_dir = tempfile.mkdtemp()
m = tf.contrib.learn.DNNLinearCombinedClassifier(
    model_dir=model_dir,
    linear_feature_columns=wide_columns,
    dnn_feature_columns=deep_columns,
    dnn_hidden_units=[100, 50])

我没有从 tensorflow 教程中更改模型的参数。我只是根据我自己的数据集定义了“wide_columns”和“deep_columns”。模型或我的输入功能有问题吗?我在 tf.learn api 网站上找不到 DNNLinearCombinedClassifier 的参考。

更新:输入函数的代码

def input_fn(df):
  continuous_cols = {k: tf.constant(df[k].values)
                     for k in CONTINUOUS_COLUMNS}

  categorical_cols = {k: tf.SparseTensor(
      indices=[[i, 0] for i in range(df[k].size)],
      values=df[k].values,
      shape=[df[k].size, 1])
                      for k in CATEGORICAL_COLUMNS}

  feature_cols = dict(continuous_cols.items() + categorical_cols.items())

  label = tf.constant(df[Label_COLUMNS].values)

  return feature_cols, label

“Label_COLUMNS”中有 24 个频道。

【问题讨论】:

  • 你能显示你的 input_fn 代码吗?
  • 当然。我已经添加了。

标签: python machine-learning neural-network tensorflow deep-learning


【解决方案1】:

问题是你必须在DNNLinearCombinedClassifier 的构造函数中指定n_classes=24。有关文档,请参阅 here

【讨论】:

  • 谢谢!这就是我需要的!
猜你喜欢
  • 2021-02-02
  • 1970-01-01
  • 2021-03-23
  • 2020-09-30
  • 2021-07-27
  • 2021-10-28
  • 2021-07-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多