我正在尝试优化我正在使用的使用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_tfrecords创建一个1MB的文件,而chunk_save_tfrecords创建一个200MB的文件!