我从 TensorFlow 的 csv reader 中遗漏了什么?
What am I missing from this csv reader for TensorFlow?
主要是网站上教程的复制粘贴。我收到一个错误:
Invalid argument: ConcatOp : Expected concatenating dimensions in the
range [0, 0), but got 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)
我也被这个tutorial困住了。当我将您的 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
,您将看到只有一次迭代 运行s。这很可能不是很有帮助(因为我用错误换取了无限执行)。
问题是由于程序中张量的形状引起的。 TL;DR 您应该使用 tf.pack()
而不是 tf.concat()
,这将转换四个标量 col
张量转换为长度为 4 的一维张量。
在我们开始之前,请注意您可以在任何 Tensor
对象上使用 get_shape()
方法来获取有关该张量的静态形状信息。例如,代码中注释掉的行可能是:
print col1.get_shape()
# ==> 'TensorShape([])' - i.e. `col1` is a scalar.
reader.read()
返回的value
张量是一个标量字符串。 tf.decode_csv(value, record_defaults=[...])
为 record_defaults
的每个元素生成一个与 value
形状相同的张量,即在本例中为标量。标量是具有单个元素的 0 维张量。 tf.concat(i, xs)
未在标量上定义:它将 N 维张量列表 (xs
) 连接成一个新的 N 维张量,沿维度 i
,其中 0 <= i < N
,如果 N = 0
.
则没有有效的 i
tf.pack(xs)
运算符就是为了简单的解决这个问题而设计的。它采用 k
个 N 维张量(具有相同形状)的列表,并将它们打包成第 0 维大小为 k
的 N+1 维张量。如果将 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.
# ...
主要是网站上教程的复制粘贴。我收到一个错误:
Invalid argument: ConcatOp : Expected concatenating dimensions in the range [0, 0), but got 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)
我也被这个tutorial困住了。当我将您的 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
,您将看到只有一次迭代 运行s。这很可能不是很有帮助(因为我用错误换取了无限执行)。
问题是由于程序中张量的形状引起的。 TL;DR 您应该使用 tf.pack()
而不是 tf.concat()
,这将转换四个标量 col
张量转换为长度为 4 的一维张量。
在我们开始之前,请注意您可以在任何 Tensor
对象上使用 get_shape()
方法来获取有关该张量的静态形状信息。例如,代码中注释掉的行可能是:
print col1.get_shape()
# ==> 'TensorShape([])' - i.e. `col1` is a scalar.
reader.read()
返回的value
张量是一个标量字符串。 tf.decode_csv(value, record_defaults=[...])
为 record_defaults
的每个元素生成一个与 value
形状相同的张量,即在本例中为标量。标量是具有单个元素的 0 维张量。 tf.concat(i, xs)
未在标量上定义:它将 N 维张量列表 (xs
) 连接成一个新的 N 维张量,沿维度 i
,其中 0 <= i < N
,如果 N = 0
.
i
tf.pack(xs)
运算符就是为了简单的解决这个问题而设计的。它采用 k
个 N 维张量(具有相同形状)的列表,并将它们打包成第 0 维大小为 k
的 N+1 维张量。如果将 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.
# ...