我有一个很大的数据集,它无法放入内存。因此,在训练时,使用SSD并且每个epoch需要太多时间。
我将我的数据集保存为9个.npz
文件的一部分。我选择第一个部分(part 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约为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()
和一次使用整个数据集进行调用有什么不同。