Tensorflow:使用输入管道 (.csv) 作为训练字典
Tensorflow: using an input-pipeline (.csv) as a dictionary for training
我正在尝试在 .csv 数据集(5008 列,533 行)上训练模型。
我正在使用文本阅读器将数据解析为两个张量,一个包含要在 [example] 上训练的数据,另一个包含正确的标签 [label]:
def read_my_file_format(filename_queue):
reader = tf.TextLineReader()
key, record_string = reader.read(filename_queue)
record_defaults = [[0.5] for row in range(5008)]
#Left out most of the columns for obvious reasons
col1, col2, col3, ..., col5008 = tf.decode_csv(record_string, record_defaults=record_defaults)
example = tf.stack([col1, col2, col3, ..., col5007])
label = col5008
return example, label
def input_pipeline(filenames, batch_size, num_epochs=None):
filename_queue = tf.train.string_input_producer(filenames, num_epochs=num_epochs, shuffle=True)
example, label = read_my_file_format(filename_queue)
min_after_dequeue = 10000
capacity = min_after_dequeue + 3 * batch_size
example_batch, label_batch = tf.train.shuffle_batch([example, label], batch_size=batch_size, capacity=capacity, min_after_dequeue=min_after_dequeue)
return example_batch, label_batch
这部分在执行类似以下内容时有效:
with tf.Session() as sess:
ex_b, l_b = input_pipeline(["Tensorflow_vectors.csv"], 10, 1)
print("Test: ",ex_b)
我的结果是Test: Tensor("shuffle_batch:0", shape=(10, 5007), dtype=float32)
到目前为止,这对我来说还不错。接下来,我创建了一个包含两个隐藏层(分别为 512 和 256 个节点)的简单模型。当我尝试训练模型时出现问题的地方:
batch_x, batch_y = input_pipeline(["Tensorflow_vectors.csv"], batch_size)
_, cost = sess.run([optimizer, cost], feed_dict={x: batch_x.eval(), y: batch_y.eval()})
我将此方法基于 this example that uses the MNIST database。
但是,当我执行此操作时,即使我只是使用 batch_size = 1
,Tensorflow 也会挂起。如果我省略了应该从张量中获取实际数据的 .eval()
函数,我会得到以下响应:
TypeError: The value of a feed cannot be a tf.Tensor object. Acceptable feed values include Python scalars, strings, lists, or numpy ndarrays.
现在我明白了,但是我不明白为什么当我包含 .eval()
函数时程序会挂起,而且我不知道在哪里可以找到有关此问题的任何信息。
编辑:我包含了整个脚本的最新版本 here。即使我实施了(据我所知)vijay m
提供的解决方案,程序仍然挂起
如错误所述,您正在尝试将张量提供给 feed_dict
。您已经定义了一个 input_pipeline
队列,但不能将其作为 feed_dict
传递。将数据传递给模型和训练的正确方法如下代码所示:
# A queue which will return batches of inputs
batch_x, batch_y = input_pipeline(["Tensorflow_vectors.csv"], batch_size)
# Feed it to your neural network model:
# Every time this is called, it will pull data from the queue.
logits = neural_network(batch_x, batch_y, ...)
# Define cost and optimizer
cost = ...
optimizer = ...
# Evaluate the graph on a session:
with tf.Session() as sess:
init_op = ...
sess.run(init_op)
# Start the queues
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(sess=sess, coord=coord)
# Loop through data and train
for ( loop through steps ):
_, cost = sess.run([optimizer, cost])
coord.request_stop()
coord.join(threads)
我正在尝试在 .csv 数据集(5008 列,533 行)上训练模型。 我正在使用文本阅读器将数据解析为两个张量,一个包含要在 [example] 上训练的数据,另一个包含正确的标签 [label]:
def read_my_file_format(filename_queue):
reader = tf.TextLineReader()
key, record_string = reader.read(filename_queue)
record_defaults = [[0.5] for row in range(5008)]
#Left out most of the columns for obvious reasons
col1, col2, col3, ..., col5008 = tf.decode_csv(record_string, record_defaults=record_defaults)
example = tf.stack([col1, col2, col3, ..., col5007])
label = col5008
return example, label
def input_pipeline(filenames, batch_size, num_epochs=None):
filename_queue = tf.train.string_input_producer(filenames, num_epochs=num_epochs, shuffle=True)
example, label = read_my_file_format(filename_queue)
min_after_dequeue = 10000
capacity = min_after_dequeue + 3 * batch_size
example_batch, label_batch = tf.train.shuffle_batch([example, label], batch_size=batch_size, capacity=capacity, min_after_dequeue=min_after_dequeue)
return example_batch, label_batch
这部分在执行类似以下内容时有效:
with tf.Session() as sess:
ex_b, l_b = input_pipeline(["Tensorflow_vectors.csv"], 10, 1)
print("Test: ",ex_b)
我的结果是Test: Tensor("shuffle_batch:0", shape=(10, 5007), dtype=float32)
到目前为止,这对我来说还不错。接下来,我创建了一个包含两个隐藏层(分别为 512 和 256 个节点)的简单模型。当我尝试训练模型时出现问题的地方:
batch_x, batch_y = input_pipeline(["Tensorflow_vectors.csv"], batch_size)
_, cost = sess.run([optimizer, cost], feed_dict={x: batch_x.eval(), y: batch_y.eval()})
我将此方法基于 this example that uses the MNIST database。
但是,当我执行此操作时,即使我只是使用 batch_size = 1
,Tensorflow 也会挂起。如果我省略了应该从张量中获取实际数据的 .eval()
函数,我会得到以下响应:
TypeError: The value of a feed cannot be a tf.Tensor object. Acceptable feed values include Python scalars, strings, lists, or numpy ndarrays.
现在我明白了,但是我不明白为什么当我包含 .eval()
函数时程序会挂起,而且我不知道在哪里可以找到有关此问题的任何信息。
编辑:我包含了整个脚本的最新版本 here。即使我实施了(据我所知)vijay m
提供的解决方案,程序仍然挂起如错误所述,您正在尝试将张量提供给 feed_dict
。您已经定义了一个 input_pipeline
队列,但不能将其作为 feed_dict
传递。将数据传递给模型和训练的正确方法如下代码所示:
# A queue which will return batches of inputs
batch_x, batch_y = input_pipeline(["Tensorflow_vectors.csv"], batch_size)
# Feed it to your neural network model:
# Every time this is called, it will pull data from the queue.
logits = neural_network(batch_x, batch_y, ...)
# Define cost and optimizer
cost = ...
optimizer = ...
# Evaluate the graph on a session:
with tf.Session() as sess:
init_op = ...
sess.run(init_op)
# Start the queues
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(sess=sess, coord=coord)
# Loop through data and train
for ( loop through steps ):
_, cost = sess.run([optimizer, cost])
coord.request_stop()
coord.join(threads)