我能在“for”循环中使用“model.fit()”来改变每次迭代的训练数据吗?

3

我有一个很大的数据集,它无法放入内存。因此,在训练时,使用SSD并且每个epoch需要太多时间。

我将我的数据集保存为9个.npz文件的一部分。我选择第一个部分(part 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约为2,500小时。 (在model.fit中使用整个数据集时,每个epoch大约需要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)。它说可以在 for 中多次调用 model.fit(),但我仍然不确定背后会发生什么。多次调用 model.fit() 和一次使用整个数据集进行调用有什么不同。

3个回答

2
如果您的模型无法适应内存,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)。
这意味着您可以尝试将训练数据进一步分成128个批次,并在SSD上执行以下操作:
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)

预处理函数应该负责从每个.npz文件中提取x和y,fit_generator函数中的steps_per_epoch参数应该是数据样本数除以批量大小后向上取整的值。
更多信息:

谢谢您的回复。我已经根据您的建议编辑了我的问题。 - T K

0

你也可以使用Dask,它默认将数据分成较小的部分,如果你有一个不适合内存的集合。


0

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接