I'm trying to train a model on a .csv dataset (5008 columns, 533 rows). I'm using a textreader to parse the data into two tensors, one holding the data to train on [example] and one holding the correct labels [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
This part is working, when executing something like:
with tf.Session() as sess:
ex_b, l_b = input_pipeline(["Tensorflow_vectors.csv"], 10, 1)
print("Test: ",ex_b)
my result is Test: Tensor("shuffle_batch:0", shape=(10, 5007), dtype=float32)
So far this seems fine to me. Next I've created a simple model consising of two hidden layers (512 and 256 nodes respectively). Where things go wrong is when I'm trying to train the model:
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()})
I've based this approach on this example that uses the MNIST database.
However, when I'm executing this, even when I'm just using batch_size = 1
, Tensorflow just hangs. If I leave out the .eval()
functions that should get the actual data from the tensors, I get the following response:
TypeError: The value of a feed cannot be a tf.Tensor object. Acceptable feed values include Python scalars, strings, lists, or numpy ndarrays.
Now this I can understand, but I don't understand why the program hangs when I do include the .eval()
function and I don't know where I could find any information about this issue.
EDIT: I included the most recent version of my entire script here. The program still hangs even though I implemented (as far as I know correctly) the solution that was offered by vijay m
As the error says, you are trying to feed a tensor to feed_dict
. You have defined a input_pipeline
queue and you cant pass it as feed_dict
. The proper way for the data to be passed to the model and train is shown in the code below:
# 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)
来源:https://stackoverflow.com/questions/44862754/tensorflow-using-an-input-pipeline-csv-as-a-dictionary-for-training