我已经阅读了 TF 页面和一些关于使用 prefetch() 和 cache() 来加速模型输入管道的帖子,并尝试在我的数据上实现它。Cache() 按预期为我工作,即在第一个纪元中从 dist 读取数据,在所有后续纪元中它只是从内存中读取数据。但我在使用 prefetch() 时遇到很多困难,我真的不明白何时以及如何使用它。有人可以帮我吗?我真的需要一些帮助。我的应用程序是这样的:我有一组大型 TFRecord 文件,每个文件都包含一些在馈送到我的网络之前要处理的原始记录。它们将被混合(不同的样本流),所以我要做的是:
def read_datasets(pattern, numFiles, numEpochs=125, batchSize=1024, take=dataLength):
files = tf.data.Dataset.list_files(pattern)
def _parse(x):
x = tf.data.TFRecordDataset(x, compression_type='GZIP')
return x
np = 4 # half of the number of CPU cores
dataset = files.interleave(_parse, cycle_length=numFiles, block_length=1, num_parallel_calls=np)\
.map(lambda x: parse_tfrecord(x), num_parallel_calls=np)
dataset = dataset.take(take)
dataset = dataset.batch(batchSize)
dataset = dataset.cache()
dataset = dataset.prefetch(buffer_size=10)
dataset = dataset.repeat(numEpochs)
return dataset
Run Code Online (Sandbox Code Playgroud)
interleave 函数中的 parse_tfrecord(x) 函数是数据应用于模型之前所需的预处理,我的猜测是预处理时间与网络的批处理时间相当。我的整个数据集(包括所有输入文件)包含大约 500 批 1024 个样本。我的问题是:
1-如果我进行缓存,我真的需要预取吗?
2- 映射、批处理、缓存、预取和重复的顺序是否正确? …
我有一组样本,每个样本都是一组属性的序列(例如,一个样本可以包含 10 个序列,每个序列有 5 个属性)。属性的数量始终是固定的,但序列(时间戳)的数量可能因样本而异。我想使用这个样本集在 Keras 中训练 LSTM 网络来解决分类问题,因此我应该将所有批次样本的输入大小填充为相同。但是pad_sequenceskeras 中的处理器获取固定数量的具有可变属性的序列,并填充每个序列中缺失的属性,而我需要向每个样本添加更多固定属性长度的序列。所以我认为我不能使用它,因此我单独填充了我的样本并制作了一个统一的数据集,然后用它来喂养我的网络。但是 Keras 函数是否有快捷方式可以做到这一点?
我还听说过在学习过程中屏蔽填充的输入数据,但我不确定我是否真的需要它,因为我的分类器在处理整个样本序列后分配一个类标签。我需要它吗?如果是的话,您能帮我举一个简单的例子来说明如何做到这一点吗?
我想将整数列表(或任何多维 numpy 矩阵)写入一个 TFRecords 示例。对于单个值或多个值的列表,我可以创建 TFRecord 文件而不会出错。我还知道如何从 TFRecord 文件中读取单个值,如下面我从各种来源编译的代码示例所示。
# Making an example TFRecord
my_example = tf.train.Example(features=tf.train.Features(feature={
'my_ints': tf.train.Feature(int64_list=tf.train.Int64List(value=[5]))
}))
my_example_str = my_example.SerializeToString()
with tf.python_io.TFRecordWriter('my_example.tfrecords') as writer:
writer.write(my_example_str)
# Reading it back via a Dataset
featuresDict = {'my_ints': tf.FixedLenFeature([], dtype=tf.int64)}
def parse_tfrecord(example):
features = tf.parse_single_example(example, featuresDict)
return features
Dataset = tf.data.TFRecordDataset('my_example.tfrecords')
Dataset = Dataset.map(parse_tfrecord)
iterator = Dataset.make_one_shot_iterator()
with tf.Session() as sess:
print(sess.run(iterator.get_next()))
Run Code Online (Sandbox Code Playgroud)
但是如何从一个示例中读回一系列值(例如 [5,6])?将featuresDict功能定义为 int64 类型,当我有多个值时它会失败,并且出现以下错误:
tensorflow.python.framework.errors_impl.InvalidArgumentError: Key: my_ints. Can't parse serialized Example.
Run Code Online (Sandbox Code Playgroud)