我对tensorflow相当新,并成功完成了强制性的MNIST教程。
我正在尝试使用一组CSV数据训练一个简单的RNN。数据是33个特征,最后是二进制输出变量(所以34列)。
我已经实现了一次读取一行的csv阅读器。我试图读取该行并将其传递到我的张量流图中。我觉得“TensorFlow-way”开始变得更加清晰,但也有一些基本的部分缺失 - 特别是因为它与将数据流传输到模型中有关。
我已经包含了一个我正在做的事情的例子。为清晰起见,大多数代码都被剥离了,但重要的部分仍然是:
import tensorflow as tf
import sys
import datapipe as datapipe
learning_rate = 0.001
n_features = 33
n_hidden = 100 # number of features in the hidden layer - I just made this up
n_classes = 2 # 0 or 1 - a binary classification
x = tf.placeholder('float', [None, 1, n_features])
y = tf.placeholder('float', [None, n_classes])
transform = tf.transpose(x)
with tf.session() as sess:
sess.run(tf.initialize_all_variables())
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(coord=coord)
datapipe = datapipe.Datapipe(filename='training.csv', features=33, epochs=100)
while not coord.should_stop():
nextline = datapipe.nextline()
# I basically want to run "transform" with the nextline of the csv file
stuff = sess.run(transform, feed_dict={ x: nextline })
coord.request_stop()
coord.join(threads)
datapipe
是:
import tensorflow as tf
class Datapipe:
def __init__(self, filename=None, features=None, epochs=100):
self.filename = filename
self.features = features
self.epochs = epochs
self.defaults = []
for i in range(self.features):
self.defaults.append([]) # require all fields to be present
def nextline(self):
file_queue = tf.train.string_input_producer([self.filename], num_epochs=self.epochs, shuffle=False)
reader = tf.TextLineReader()
key, csv_str = reader.read(file_queue)
return tf.pack(tf.decode_csv(csv_str, record_defaults=self.defaults))
当我运行此示例时,我收到错误:
TypeError: The value of a feed cannot be a tf.Tensor object. Acceptable feed values include Python scalars, strings, lists, or numpy ndarrays.
感谢您的帮助!
修改
我的问题基本上是:如何将文件数据(例如csv)提供给张量流模型?(教程没有帮助)
编辑12/09/2016
根据Sergii的回答,我现在正在这样做:
with open('../data/training2.csv') as f:
reader = csv.reader(f)
for line in reader:
arr = np.array(line)
x = arr[0:len(arr)-1:1]
y = arr[len(arr)-1:len(arr):1]
sess.run(transform, feed_dict={ x: x, y: y })
答案 0 :(得分:1)
Tensor
个对象不能是feed_dict
的值,它需要实际值,如numpy
数组,字符串等作为输入。请参阅示例this issue.
尝试修改nextline
方法,不要在那里创建Tensor
,而是将csv字符串转换为numpy数组。
答案 1 :(得分:1)
我不知道文件中的占位符和读取数据是互补的还是排他的,但nextline
变量已经是一个张量,其中包含来自CSV的33个值(因此是X的一个例子)。
我认为你可以做到:
transform = tf.transpose(nextline)
stuff = sess.run(transform)
println(stuff)
您会看到stuff
为数组,这是CSV中的第一行。
如果您重复sess.run(transform)
,您将获得下一行,依此类推。
要使用批处理,您可以执行以下操作:
X_batch = tf.train.batch(nextline, batch_size=100)
stuff = sess.run(X_batch)
println(stuff)
每次拨打sess.run(X_batch)
时,您都会获取100行CSV。