tensorflow MNIST fully_connected_feed.py失败:range()至少需要2个参数(给定1个)

时间:2015-11-13 14:28:25

标签: tensorflow

我无法在其中一个tensor flow tutorials中运行该示例。该教程说运行我只需要输入python fully_connected_feed.py。当我这样做时,它会获取输入数据,但之后会失败,如下所示:

Extracting data/train-images-idx3-ubyte.gz
Extracting data/train-labels-idx1-ubyte.gz
Extracting data/t10k-images-idx3-ubyte.gz
Extracting data/t10k-labels-idx1-ubyte.gz
Traceback (most recent call last):
  File "fully_connected_feed.py", line 225, in <module>
    tf.app.run()
  File "/Users/me/anaconda/lib/python2.7/site-packages/tensorflow/python/platform/default/_app.py", line 11, in run
    sys.exit(main(sys.argv))
  File "fully_connected_feed.py", line 221, in main
    run_training()
  File "fully_connected_feed.py", line 141, in run_training
    loss = mnist.loss(logits, labels_placeholder)
  File "/Users/me/tftmp/mnist.py", line 96, in loss
    indices = tf.expand_dims(tf.range(batch_size), 1)
TypeError: range() takes at least 2 arguments (1 given)

认为导致此错误是因为会话设置和/或张量评估存在问题。这是mnist.py中导致问题的函数:

def loss(logits, labels):
  """Calculates the loss from the logits and the labels.

  Args:
    logits: Logits tensor, float - [batch_size, NUM_CLASSES].
    labels: Labels tensor, int32 - [batch_size].

  Returns:
    loss: Loss tensor of type float.
  """
  # Convert from sparse integer labels in the range [0, NUM_CLASSSES)
  # to 1-hot dense float vectors (that is we will have batch_size vectors,
  # each with NUM_CLASSES values, all of which are 0.0 except there will
  # be a 1.0 in the entry corresponding to the label).
  batch_size = tf.size(labels)
  labels = tf.expand_dims(labels, 1)
  indices = tf.expand_dims(tf.range(batch_size), 1)
  concated = tf.concat(1, [indices, labels])
  onehot_labels = tf.sparse_to_dense(
      concated, tf.pack([batch_size, NUM_CLASSES]), 1.0, 0.0)
  cross_entropy = tf.nn.softmax_cross_entropy_with_logits(logits, onehot_labels,
                                                          name='xentropy')
  loss = tf.reduce_mean(cross_entropy, name='xentropy_mean')
  return loss

如果我将loss函数中的所有代码放在with tf.Session():块中,则会超出此错误。但是,我后来得到了关于未初始化变量的其他错误,因此我猜测某些重大问题是会话设置或初始化或其他问题。作为张量流的新手,我有点不知所措。有任何想法吗?

[注意:我根本没有编辑过代码,只是从tensorflow教程下载并试图按照指示运行,python fully_connected_feed.py]

3 个答案:

答案 0 :(得分:6)

出现这个问题是因为在GitHub上的最新版本的TensorFlow源代码中,tf.range()已经updated对其参数更加宽容(以前它需要两个参数;现在它具有相同的语义作为Python的range()内置函数),fully_connected_feed.py示例已更新以利用此功能。

但是,如果您尝试针对TensorFlow的二进制分发运行此版本,则会出现此错误,因为tf.range()的更改尚未合并到二进制包中。

最简单的解决方案是下载the old version of mnist.py。或者,您可以build from source使用本教程的最新版本。

答案 1 :(得分:1)

你可以正确的结果修复这样的mnist代码:

public static bool SameAs<T>(this T val, params T[] values) where T : struct
{
    return values.All(x => x.Equals(val));
}

if (4.SameAs(2*2,2+2)) { ... }

答案 2 :(得分:0)

TypeError: range() takes at least 2 arguments (1 given)

那是错误。

查看tensorflow docs for range,我们可以看到range的函数签名为start, limit, delta=1, name='range'。这意味着函数调用至少需要两个参数。您的示例仅显示提供的一个参数。

可以在文档中找到一个示例:

# 'start' is 3
# 'limit' is 18
# 'delta' is 3
tf.range(start, limit, delta) ==> [3, 6, 9, 12, 15]