我可以在“ for”循环中使用“ model.fit()”来更改每次迭代中的训练数据

时间:2019-08-17 09:06:23

标签: python tensorflow machine-learning keras

我的数据集很大,内存不足。因此,在培训期间,使用SSD会花费很多时间。

我保存了.npz文件的9个数据集。我选择第一部分(第0部分)作为验证部分,并且没有在培训中使用。

我使用下面的代码,并且accval_acc 结果很好。但是我觉得我在某个地方犯了个大错误。我没有看到这样的例子

for part in range(1,9):
 X_Train, Y_Train = loadPart(part)
 history = model.fit(X_Train, Y_Train, batch_size=128, epochs=1, verbose=1)

我也将第0部分加载为测试数据

val_loss, val_acc = model.evaluate(X_Test, Y_Test)

训练完数据集的每个部分后,我尝试检查val_acc,发现val_acc正在增加。

您能否让我知道此用法是否合法以及为什么?

编辑:

我尝试了fit_generator,但是在训练过程中它仍然使用磁盘,而ETA大约需要2500小时。 (在整个数据集的model.fit中,每个时期大约需要30分钟)我使用以下代码:

model.fit_generator(generate_batches()), steps_per_epoch=196000,epochs=10)
def generate_batches(): 
   for part in range(1,9): 
      x, y = loadPart(part) yield(x,y)

def loadPart(part): 
   data = np.load('C:/FOLDER_PATH/'+str(part)+'.npz') 
   return [data['x'], data['y']

并且X数据形状为(196000,1536,1)

编辑2: 我在[github]( https://github.com/keras-team/keras/issues/4446)。它说可以多次调用model.fit()是可以的,但是我仍然不确定后面会发生什么。多次调用model.fit()和一次对整个数据集进行调用有什么区别。

3 个答案:

答案 0 :(得分:1)

如果您的模型不适合RAM,那么keras文档会建议以下内容(https://keras.io/getting-started/faq/#how-can-i-use-keras-with-datasets-that-dont-fit-in-memory):

  

您可以使用model.train_on_batch(x,y)和model.test_on_batch(x,y)进行批量训练。请参阅模型文档。

     

或者,您可以编写一个生成一批训练数据的生成器,并使用model.fit_generator(data_generator,steps_per_epoch,epochs)方法。

这意味着您可以尝试将训练数据进一步分成SSD上的128个批次,然后执行以下操作:

import glob
import numpy as np

def generate_batches(data_folder):
    while True:
        batches_paths = glob.glob("%s/*.npz" % data_folder)
        for batch_path in batches_paths:
            with np.load(batch_path) as batch:
                x, y = preprocess_batch(batch)
                yield (x, y)


model.fit_generator(generate_batches("/your-data-folder"), steps_per_epoch=10000, epochs=10)

preprocess_batch函数将负责从每个.npz文件中提取x和y,而fit_generator函数中的steps_per_epoch参数应为数据样本数的四舍五入值除以批量大小。

更多信息:

答案 1 :(得分:0)

您也可以使用dask,如果您的数据集不适合RAM,则默认情况下会将数据分成较小的部分

答案 2 :(得分:0)

如果您按照问题中的描述进行培训,并且一次培训,则没有任何区别。但是,如果您要进行多次训练并从以前的训练继续进行,则应该在每个时期(即,在1个时期内通过9组训练)保存模型,或者在每种情况下,可以在每个数据集之后保存模型(即,在9个数据集中的每1个之后),并在每个会话中使用model.load_weights("path to model")加载权重,然后再继续训练。

您可以在每个时期之后使用model.save("path to directory")保存模型。