13

它主要是网站上教程的复制粘贴。我收到一个错误:

无效参数:ConcatOp:预期的连接维度在 [0, 0) 范围内,但得到 0 [[Node: concat = Concat[N=4, T=DT_INT32, _device="/job:localhost/replica:0/task: 0/cpu:0"](concat/concat_dim, DecodeCSV, DecodeCSV:1, DecodeCSV:2, DecodeCSV:3)]]

我的 csv 文件的内容是:

3,4,1,8,4

 import tensorflow as tf


filename_queue = tf.train.string_input_producer(["test2.csv"])

reader = tf.TextLineReader()
key, value = reader.read(filename_queue)

# Default values, in case of empty columns. Also specifies the type of the
# decoded result.
record_defaults = [[1], [1], [1], [1], [1]]
col1, col2, col3, col4, col5 = tf.decode_csv(
    value, record_defaults=record_defaults)
# print tf.shape(col1)

features = tf.concat(0, [col1, col2, col3, col4])
with tf.Session() as sess:
  # Start populating the filename queue.
  coord = tf.train.Coordinator()
  threads = tf.train.start_queue_runners(coord=coord)

  for i in range(1200):
    # Retrieve a single instance:
    example, label = sess.run([features, col5])

  coord.request_stop()
  coord.join(threads)
4

2 回答 2

13

问题是由于程序中张量的形状而出现的。TL;DR而不是tf.concat()你应该使用tf.pack(),它将四个标col量张量转换为长度为 4 的一维张量。

在我们开始之前,请注意您可以get_shape()在任何Tensor对象上使用该方法来获取有关该张量的静态形状信息。例如,代码中注释掉的行可能是:

print col1.get_shape()
# ==> 'TensorShape([])' - i.e. `col1` is a scalar.

value返回的张量reader.read()是一个标量字符串。tf.decode_csv(value, record_defaults=[...])为 的每个元素生成record_defaults与 的形状相同的张量value,即在这种情况下为标量. 标量是具有单个元素的 0 维张量。未在标量上tf.concat(i, xs)定义:它将 N 维张xs量(i0 <= i < NiN = 0

tf.pack(xs)运算符旨在简单地解决这个问题。它需要一个kN 维张量列表(具有相同的形状)并将它们打包成一个 N+1 维张量,其大小k在第 0 维。如果将 替换为tf.concat()tf.pack()您的程序将运行:

# features = tf.concat(0, [col1, col2, col3, col4])
features = tf.pack([col1, col2, col3, col4])

with tf.Session() as sess:
  # Start populating the filename queue.
  # ...
于 2015-11-13T05:59:09.947 回答
1

我也坚持这个教程。当我将您的问题更改with tf.Session()为:

sess = tf.Session()
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(coord=coord)

for i in range(2):
    #print i
    example, label = sess.run([features, col5])

coord.request_stop()
coord.join(threads)

sess.close()

错误消失,TF开始运行,但看起来卡住了。如果您取消注释# print,您将看到只运行一次迭代。很可能这并没有真正的帮助(因为我用错误换取了无限执行)。

于 2015-11-13T05:44:46.413 回答