DNN*_*RCH 8 machine-learning tensorflow tensorflow-datasets
我正在训练一个线性回归模型。我使用 tf.contrib.data 准备数据集,对其进行洗牌并分批提供:
dataset = tf.contrib.data.TFRecordDataset(filename)
dataset = dataset.map(
_parse_function, num_threads=16, output_buffer_size=100 * batch_size)
dataset = dataset.repeat(5)
dataset = dataset.shuffle(buffer_size=100000)
dataset = dataset.padded_batch(batch_size, padded_shapes=([None], [None]))
iterator = dataset.make_initializable_iterator()
x_inputs, y_ = iterator.get_next()
Run Code Online (Sandbox Code Playgroud)
以下是我们的训练损失:

很奇怪,在每个 epoch 开始时(迭代=100k),我们在训练损失中有一个脉冲。如果训练过程继续,我们会在接下来的 epoch 开始时看到相同的模式。
假设您的数据集的记录少于 100000 条,问题可能是输入随机性不足。直观地说,如果现有数据没有被打乱并且按顺序具有某种结构,则训练过程可能会过度拟合文件末尾的记录,并且当您从头开始时,模型将不会在记录上表现良好靠近文件开头,损失会增加。
正确的解决方案取决于数据集的精确细节,但以下一些方法可能有用:
如果可能,请将buffer_size您传递的数据增加到Dataset.shuffle()与数据集一样大。(如果您的整个数据集不适合内存,这可能是不可能的。)
通过在训练之前随机化输入文件的顺序,确保数据在记录排序中不具有任何结构。
除了随机化文件内的顺序之外,您还可以将数据分区到几个不同的文件中,并使用以下命令随机化您访问这些文件的顺序:
dataset = tf.data.Dataset.list_files(shard_filenames)
dataset = dataset.shuffle(len(shard_filenames))
dataset = dataset.flat_map(lambda filename: tf.data.TFRecordDataset(filename))
# ...
Run Code Online (Sandbox Code Playgroud)作为 (3) 的扩展,您可以使用Dataset.interleave()in 来Dataset.flat_map()一次读取多个分片。
| 归档时间: |
|
| 查看次数: |
3471 次 |
| 最近记录: |