情况:相对较少的,相对较大的训练文件,处理一次只发生在它的一小部分。
目标:读取一小批大型文件一次,处理部分而不获取下一个管道项目。
以下内容应该是我的代码的相关摘录:
filename_queue = (...)
reader = tf.TFRecordReader()
feature_list = [tf.parse_single_example(
reader.read(filename_queue)[1],
features={...}) for _ in range(batch_size)] # Result: list of binary information
parsed_features = [tf.reshape(
tf.cast(tf.decode_raw(features['data_raw'], tf.float64),
tf.float32), [-1, num_cols]) for features in
feature_list] # Result: List of Tensors
training_batch = tf.stack(
[parsed_features[i][starts_used[i]:ends_used[i]:1, :]
for i in range(self.batch_size)], 0,
name="stack_features") # Result: Stacked extracts from the list of Tensors
我们的想法是在获得新starts_used
之前,为ends_used
和features_list
执行不同的值。但是,实际上,training_batch
的呼叫似乎每次都会触发读者。
问题:如何暂时冻结parsed_features
的值?我尝试将解析放入一个单独的函数中,但这没有帮助。
(非必要背景:我尝试在非常长的序列(不同大小)上使用RNN进行分类。而不是计算一个完整序列(非常慢)的梯度我尝试截断的backprop,将最终状态作为下一轮的初始状态传递。因此,只有完成所有序列的处理后才能重新加载序列。)
修改
似乎有用的是使用不可训练的常量变量而不是training_batch
中的张量,我每次完成分析时都会重新初始化,但这看起来像是一个相当hacky的解决方案。这个解决方案的一个问题是,初始化不清楚:如果我在init_op
之前启动队列运行程序,init_op
会出现错误(" FIFOQueue' _2_input_producer' is关闭并且元素不足(请求1,当前大小为0)"),如果我之前执行init_op
,它将永远挂起(因为它需要读者的值)。