首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >流动训练损失在不同跑步过程中有宏观相似之处

问流动训练损失在不同跑步过程中有宏观相似之处
EN

Stack Overflow用户
提问于 2018-06-26 15:23:36
回答 1查看 48关注 0票数 1

我有有线电视新闻网,我正在训练一个图像集,是存储在一个tfrecord。有关守则如下:

代码语言:javascript
复制
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)

具有不同随机种子的多次运行的损失函数具有许多宏观相似性(如下图中的箭头所示)。

​

​

这里有4次单独的训练。注意,为了突出相似之处,这是放大一点,这只是头1000次迭代。这些相似之处大约每1000个迭代就会出现一次。如果我改变批次的大小,同样的事情似乎发生了变化。

对我来说,这指的是数据集根本没有被洗牌。知道为什么会这样吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-26 16:01:42

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

我喜欢把buffer_size看作是在数据集上移动的窗口,其中随机化发生在窗口内(它比这更细微,但这是我喜欢可视化的图像)。因此,如果您的窗口大小与数据集的大小相比非常小,一般情况下,您不会在任何给定时间对大部分数据集进行随机化,从而导致跨迭代的批之间的周期性关联。

尝试将buffer_size从300增加到许多数据点,您可以轻松地将这些数据点放入内存。因此,例如,如果您正在处理n维浮点数据,并且您有500MB用于数据预处理,那么您可以在内存中为洗牌(近似为80000表示n=100)安装大约500MB/(n*64B)。在创建批处理时,这将增强随机化的程度。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51046450

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档