gpt4 book ai didi

python - Tensorflow 训练损失在不同的运行中具有宏观相似性

转载 作者:行者123 更新时间:2023-11-30 09:06:27 25 4
gpt4 key购买 nike

我正在使用 CNN 训练存储在 tfrecord 中的图像集。相关代码如下:

def parse_function(proto):
....

train_path = "...."
seed = random.randint(0, int(2**32 - 1))
buffer_size = 300

tf.set_random_seed(seed)
train_set = tf.data.TFRecordDataset(train_path)
train_set = train_set.map(parse_function)
train_set = train_set.shuffle(buffer_size=buffer_size, seed=seed)
train_set = train_set.batch(batch_size)
train_set = train_set.repeat()

iterator = train_set.make_one_shot_iterator()
next_element = iterator.get_next()
model = build_mode(next_element)
with tf.Session() as sess:
for i in range(iters):
sess.run(model.train_op)

使用不同随机种子进行多次运行的损失函数具有许多宏观相似性(由下图中的箭头表示)

Loss value vs iteration with macro similarities

这里有 4 个单独的运行正在进行训练。请注意,为了突出相似性,将其放大了一点,这只是前 1000 次迭代。这些相似性大约每 1000 次迭代就会出现一次。如果我更改批量大小,似乎会发生同样的事情,只是发生了变化。

对我来说,这表明数据集根本没有被洗牌。知道为什么会发生这种情况吗?

最佳答案

我怀疑该问题与使用的批量大小和缓冲区大小有关。 shuffle 中的 buffer_size 参数表示后续 batch 函数在任何给定时间采样的数据集中的元素数量。因此,如果 buffer_size 不够大(特别是与batch_size 相比),则在对数据集进行采样时可能没有足够的随机化。

我喜欢将 buffer_size 视为跨数据集的移动窗口,其中随机化发生在窗口内(它比这更微妙,但这是我喜欢可视化的图像)。因此,如果您的窗口大小与数据集的大小相比非常小,通常,您不会在任何给定时间对数据集的大部分进行随机化,从而导致迭代中的批处理之间出现周期性相关性。

尝试将 buffer_size300 增加到内存可以轻松容纳的数据点数量。例如,如果您正在处理 n 维 float 据,并且您有 500MB 可以用于数据预处理,那么您可以容纳大约 500MB/(n *64B) 在内存中用于随机播放(对于 n=100,大约为 80000)。这应该会增强创建批处理时的随机化程度。

关于python - Tensorflow 训练损失在不同的运行中具有宏观相似性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51046450/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com