如何使用keras在单个epoch上重组多个fit调用

aiqt4smr  于 2023-04-06  发布在  其他
关注(0)|答案(2)|浏览(155)

我在Go of datas上用kearas训练一个模型,在我的计算机无法处理所需的RAM的时候。所以我试图实现我的训练,因为1 epoche是用多个model.fit调用完成的,比如:

for epoche in range(nbEpoches):
    for index_df in range(len(list_of_dataFrames)):
        dataFrame = load_dataFrame(list_of_dataFrames, index_df) # load in ram only this DF
        X_train, Y_train, X_test, Y_test = calc_train_arrays(dataFrame)
        model.fit(
            X_train, Y_train,
            validation_data=(X_test, Y_test),
            # ... what I am asking
            batch_size=batch_size,
        )

而X_train和X_test是形状的numpy数组(成千上万,35到200,54+),因此使用多个批次是强制性的(对于GPU的VRAM),并且动态加载dataFrames(对于RAM),这迫使我对同一个epoch使用多个fit调用。
我问如何使用model.fit函数来做到这一点。
我还想知道是否使用一个形状数组的生成器(batch_size,35+,54+)和指定steps_per_epoch可以是一个想法?
我首先尝试通过仅在大约20k样本的单个dataFrame上进行训练来避免这个问题,但是模型存在泛化问题。我还尝试每个dataframe只做一个epoch,但是似乎每个dataframe都在学习其他dataframe。

wxclj1h5

wxclj1h51#

我想你有两个选择。
1.您可以尝试自定义数据生成器。这里有一个教程(我认为这可能有点困难):https://medium.com/analytics-vidhya/write-your-own-custom-data-generator-for-tensorflow-keras-1252b64e41c3
1.你也可以定义一个自定义训练循环,这里有一个教程:https://www.tensorflow.org/guide/keras/writing_a_training_loop_from_scratch
我不确定这是否是你想要的。

bwitn5fc

bwitn5fc2#

你应该使用fit_generator而不是fit。它会根据需要加载示例,而不是一次加载所有示例。如果你对Python 2很熟悉,就像xrangerange之间的区别一样,range创建一个列表并将其放入你的ram中,而xrange将创建一个生成器,range现在默认为Python 3中的xrange行为。
https://faroit.com/keras-docs/1.2.0/models/model/
也只是一个PSA,当我第一次对ML感兴趣时,我并不知道这一点,但Keras现在是Tensorflow,Caffe现在是Pytorch。Keras和Caffe现在可能被认为是较老的工具,可能不会像Pytorch或Tensorflow那样频繁更新。就我个人而言,我推荐Pytorch,因为Tensorflow是由Google拥有的,Pytorch有更多的开源精神。

相关问题