Tensorflow 具有长输入序列分块的TFRecords示例管道

Tensorflow 具有长输入序列分块的TFRecords示例管道,tensorflow,time-series,file-format,Tensorflow,Time Series,File Format,我正在尝试优化使用GRU的模型的输入管道。数据由大量文件组成,其中包含长度为5000的时间序列,维度为50。我知道,由于渐变消失,将长度为5000的单个序列输入RNN是不可行的,您应该尝试将其分为(5000-seq_len)重叠块,其中seq_len是一个更易于管理的长度,例如200个时间步 将其用于TFRecords/SequenceExamples最明显的方法是将每个块作为新的SequenceExample包含在同一个文件中。但是,这似乎效率极低,因为生成的TFRecords文件中的大多数数

我正在尝试优化使用GRU的模型的输入管道。数据由大量文件组成,其中包含长度为5000的时间序列,维度为50。我知道,由于渐变消失,将长度为5000的单个序列输入RNN是不可行的,您应该尝试将其分为(5000-seq_len)重叠块,其中seq_len是一个更易于管理的长度,例如200个时间步

将其用于TFRecords/SequenceExamples最明显的方法是将每个块作为新的SequenceExample包含在同一个文件中。但是,这似乎效率极低,因为生成的TFRecords文件中的大多数数据都是重复数据

有没有更好的方法?关于如何使用不涉及图像的TFRecords,我看到的例子很少,也没有使用非平凡序列长度的例子

例如:

def chunk_save_tfrecords(X, file_path_prefix, seq_length):

    # Generate tfrecord writer
    result_tf_file = file_path_prefix + '.tfrecords' 
    with tf.python_io.TFRecordWriter(result_tf_file) as writer:

        # Chunk the data
        for i in range(int(X.shape[0] - seq_length)):
            chunk = X[i:i+seq_length]

            data_features = [
                tf.train.Feature(
                    float_list=tf.train.FloatList(value=chunk[t])) 
                                for t in range(seq_length)] # FloatList per timestep
            feature_lists = tf.train.FeatureLists(
                feature_list={
                    'data': tf.train.FeatureList(feature=data_features)})

            serialized = tf.train.SequenceExample(
                feature_lists=feature_lists).SerializeToString()
            writer.write(serialized)

def save_tfrecords(X, file_path_prefix):

    # Generate tfrecord writer
    result_tf_file = file_path_prefix + '.tfrecords' 
    with tf.python_io.TFRecordWriter(result_tf_file) as writer:

        data_features = [
            tf.train.Feature(
                float_list=tf.train.FloatList(value=X[t])) 
                            for t in range(X.shape[0])] # FloatList per timestep
        feature_lists = tf.train.FeatureLists(
            feature_list={
                'data': tf.train.FeatureList(feature=data_features)})

        serialized = tf.train.SequenceExample(
            feature_lists=feature_lists).SerializeToString()
        writer.write(serialized)

test = np.random.randn(5000,50)
save_tfrecords(test, 'test')
chunk_save_tfrecords(test, 'test_chunk', 200)

save\u tfrecords创建1MB文件,而chunk\u save\u tfrecords创建200MB文件

我的建议是,作为模型输入管道的一部分,动态地进行此转换。这样,您就不需要将数据具体化到磁盘。请看一看较新的
Dataset
API:,它的设计目的是使编写灵活的输入管道变得容易。感谢您发布此问题。我一直在做类似的事情。我有一个问题:区块重叠有多重要?这似乎有很多冗余。创建不重叠的块(例如,
i
seq_length
而不是按1递增)是不是一件坏事?当然,然后您必须决定如何处理最后的部分块。但是在这种情况下,你可以,比如说,允许最后一块与倒数第二块重叠,就像这样:
final\u chunk=X[X\u len-seq\u length:X\u len]
其中
X\u len=X.shape[0]