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

时间:2017-11-17 17:56:00

标签: python neural-network keras

我有一个神经网络,我在非常大量的数据上训练它。这些数据不适合我的计算机内存,因此我必须将其分解并以块的形式加载。因此,而不是使用内置在纪元计数器中的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)

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

1 个答案:

答案 0 :(得分:1)

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

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

然后您可以致电fit_generator来训练您的模型(不要忘记将steps_per_epoch设置为完成纪元所需的批次数。)

或者,如果你想一次训练一个纪元,你需要不断增加纪元数并指定起始纪元,如下:

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

这样学习率会随着时间的推移而衰减。