我的目标如下:
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)
答案 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