TensorFlow在两个队列之间进行评估

时间:2017-04-28 19:23:26

标签: tensorflow queue eval

我的目标如下:

1)。使用tf.train.string_input_producer和tf.TextLineReader从文件中读取行。

2)。使用eval将包含文件行的结果张量转换为普通字符串,以便在批处理前进行预处理 (TensorFlow的有限字符串操作不足以满足我的目的)

3)。将这些预处理的字符串转换回张量(可能使用tf.constant?)

4)。在生成的张量上使用tf.train.batch。

以下代码是我正在处理的简化版本。

执行“After batch”打印语句后,REPL会在最终eval的print语句中挂起。

从我读过的内容来看,我感觉这是因为

threads = tf.train.start_queue_runners(coord = coord, sess = sess)
在调用tf.train.batch之后,

需要运行。但是如果我这样做,那么REPL当然会挂在第一个eval

evalue = value.eval(session = sess)

需要进行预处理。

在队列之间在张量和值之间来回转换的最佳方法是什么? (我真的希望我能事先没有预先处理我的数据文件。)

import tensorflow as tf
import os

def process(string):
    return string.upper()

def main():

    sess = tf.Session()

    filenames = tf.constant(["test_data/" + f for f in os.listdir("./test_data")])

    filename_queue = tf.train.string_input_producer(filenames)
    file_reader = tf.TextLineReader()
    key, value = file_reader.read(filename_queue)

    coord = tf.train.Coordinator()
    threads = tf.train.start_queue_runners(coord = coord, sess = sess)

    evalue = value.eval(session = sess)
    proc_value = process(evalue)
    tensor_value = tf.constant(proc_value)

    batch = tf.train.batch([tensor_value], batch_size = 2, capacity = 2)

    print "After batch."
    print batch.eval(session = sess)

1 个答案:

答案 0 :(得分:0)

我们讨论了一种稍微不同的方法,我认为这样可以实现您的需求:

Converting TensorFlow tutorial to work with my own data

不确定您正在阅读哪些文件格式,但上面的示例逐行读取CSV并将其打包成随机批次。

如果您正在阅读CSV,那么,简而言之,我认为您可能想要做的不是立即从value返回file_reader.read(filename_queue),您可以尝试做一些预先首先处理,然后返回THAT,如下所示:

rDefaults = [['a'] for row in range((ROW_LENGTH))]
_, value = reader.read(filename_queue)
whole_row = tf.decode_csv(value, record_defaults=rDefaults)
cell1 = tf.slice(whole_row, [0], [1]) # one specific cell that contains a string
cell2 = tf.slice(whole_row, [1], [2]) # another cell that contains a string
# do some processing on cell1 and cell2
return cell1, cell2