gpt4 book ai didi

python - 当数据集不适合内存时,Keras 优化器状态

转载 作者:行者123 更新时间:2023-11-28 18:17:35 25 4
gpt4 key购买 nike

我有一个神经网络,我正在用大量数据对其进行训练。数据不适合我的计算机内存,因此我必须将其分解并分块加载。因此,与其使用像这样的内置纪元计数器的 keras:

    model.fit(x=X,y=Y,epochs=20)

我正在为训练编写明确的 for 循环,例如:

    for i in range(iter): #iter is now my counter for epochs
shuffle(datachunks) #pseudocode to shuffle the data around
for j in range(datachunks):
model.fit(x=X_chunk,y=Y_chunk,epochs=1)

我的问题涉及学习率衰减。我知道有两种在 keras 中实现学习率衰减的方法,一种是在优化器中实现它,例如:

    keras.optimizers.Adam(lr=0.001,decay=1e-6)

这里假设衰减发生在“每次更新”(我猜是每批处理?这是我的第二个问题......我还没有完全弄清楚衰减时间表到底是什么)。我知道实现学习率衰减的第二种方法是通过回调中的学习率调度程序,如下所示:

    keras.callbacks.LearningRateScheduler(schedule)

此调度程序中的迭代变量应该是 epoch,因此调度函数应将 epoch 作为输入并输出新的学习率。那么我的问题是,这些学习率衰减机制中的任何一个对我有用吗?我有一个明确的 for 循环,每次调用 model.fit 时,它只进行 1 个训练周期。如果我使用回调方法,它是否会一直将“1”输入到时间表中,从而永远不会降低学习率?如果我在优化器中使用内置衰减,优化器会在每次迭代时重置并返回到原始学习率,还是会记得在所有循环中不断降低学习率?同样的问题也适用于其他超参数,例如动量(适用时),它是先前梯度的移动窗口平均值。当我以这种方式分解数据时,keras 是否会跟踪这些跨数据 block 和时期的移动窗口平均值?

最佳答案

理想情况下,您应该使用具有大量数据的生成器。您的生成器一次只需要处理一批数据。它应该是这样的:

def myGenerator():
while True:
x,y=getSomeDataFromFile(batchSize)
yield (x,y)

然后您可以调用 fit_generator 来训练您的模型(不要忘记将 steps_per_epoch 设置为完成一个纪元所需的批处理数)。

或者,如果您想一次训练一个 epoch,则需要不断增加 epoch 的数量并指定起始 epoch,如下所示:

model.fit(x, y, epochs=i, initial_epoch=i)

这样学习率会随着时间衰减。

关于python - 当数据集不适合内存时,Keras 优化器状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47356625/

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