我的数据集很大,内存不足。因此,在培训期间,使用SSD会花费很多时间。
我保存了.npz
文件的9个数据集。我选择第一部分(第0部分)作为验证部分,并且没有在培训中使用。
我使用下面的代码,并且acc
和val_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()
和一次对整个数据集进行调用有什么区别。>
答案 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")
保存模型。