我在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。
2条答案
按热度按时间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
我不确定这是否是你想要的。
bwitn5fc2#
你应该使用
fit_generator
而不是fit
。它会根据需要加载示例,而不是一次加载所有示例。如果你对Python 2很熟悉,就像xrange
和range
之间的区别一样,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有更多的开源精神。