几次调用张量而没有重新读取

时间:2017-08-30 15:02:21

标签: python tensorflow

情况:相对较少的,相对较大的训练文件,处理一次只发生在它的一小部分。

目标:读取一小批大型文件一次,处理部分而不获取下一个管道项目。

以下内容应该是我的代码的相关摘录:

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_usedfeatures_list执行不同的值。但是,实际上,training_batch的呼叫似乎每次都会触发读者。

问题:如何暂时冻结parsed_features的值?我尝试将解析放入一个单独的函数中,但这没有帮助。

(非必要背景:我尝试在非常长的序列(不同大小)上使用RNN进行分类。而不是计算一个完整序列(非常慢)的梯度我尝试截断的backprop,将最终状态作为下一轮的初始状态传递。因此,只有完成所有序列的处理后才能重新加载序列。)

修改 似乎有用的是使用不可训练的常量变量而不是training_batch中的张量,我每次完成分析时都会重新初始化,但这看起来像是一个相当hacky的解决方案。这个解决方案的一个问题是,初始化不清楚:如果我在init_op之前启动队列运行程序,init_op会出现错误(" FIFOQueue' _2_input_producer' is关闭并且元素不足(请求1,当前大小为0)"),如果我之前执行init_op,它将永远挂起(因为它需要读者的值)。

0 个答案:

没有答案