【问题标题】:Using csv training data in tensorflow RNN在 tensorflow RNN 中使用 csv 训练数据
【发布时间】:2016-09-12 05:05:52
【问题描述】:

我是 tensorflow 的新手,并且成功完成了必修的 MNIST 教程。

我正在尝试使用一组 CSV 数据训练一个简单的 RNN。数据是 33 个特征,最后是一个二进制输出变量(所以 34 列)。

我已经实现了一次读取一行的 csv 阅读器。我正在尝试读取该行并将其传递到我的张量流图中。我觉得“TensorFlow 方式”开始变得更加清晰,但也缺少一些基本部分——尤其是与将数据流式传输到模型中有关的部分。

我在下面提供了一个我正在做的事情的例子。为了清楚起见,大部分代码已被删除,但重要的部分仍然存在:

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)输入到 tensorflow 模型中?(教程没有帮助)

编辑 2016 年 9 月 12 日

根据 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 })

【问题讨论】:

    标签: csv tensorflow


    【解决方案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。

    【讨论】:

      【解决方案2】:

      Tensor 对象不能是feed_dict 的值,它需要实际值,如numpy 数组、字符串等作为输入。例如见this issue.

      尝试修改nextline 方法,不要在那里创建Tensor,而是将你的csv字符串转换为numpy数组。

      【讨论】:

      • 听起来不错。我想使用原生 tensorflow csv 阅读器方法,因为我还想要一种原生方式来批处理数据(例如 tf.train.batch)。有什么办法可以把一个 tensorflow 对象变成一个 numpy 数组?