我的模型有100,000张训练图像样本,我该如何修改下面的代码以分批训练?使用model.fit_generator时,我需要在生成器函数中指定以下内容:
def data_generator(descriptions, features, n_step, max_sequence): # 循环直到训练结束 while 1: # 遍历数据集中照片的标识符 for i in range(0, len(descriptions), n_step): Ximages, XSeq, y = list(), list(),list() for j in range(i, min(len(descriptions), i+n_step)): image = features[j] # 检索文本输入 desc = descriptions[j] # 生成输入-输出对 in_img, in_seq, out_word = preprocess_data([desc], [image], max_sequence) for k in range(len(in_img)): Ximages.append(in_img[k]) XSeq.append(in_seq[k]) y.append(out_word[k]) # 将这一批样本传递给模型 yield [[array(Ximages), array(XSeq)], array(y)]
我的model.fit_generator
代码如下:
model.fit_generator(data_generator(texts, train_features, 1, 150), steps_per_epoch=1500, epochs=50, callbacks=callbacks_list, verbose=1)
任何帮助都将非常受欢迎,我在云端的16GB V100 Tesla上进行训练
编辑:我的图像标注模型为DSL中的每个标记(250个标记)创建一个训练样本。数据集有50张图片(相当于12500个训练样本),批量大小为1时,我会遇到内存溢出(OOM)。当大约有32张图片(相当于8000个样本,批量大小为1)时,它可以正常训练。我的问题是,我能否更好地优化我的代码,还是我唯一的选择是使用多GPU?
解决方案:
steps_per_epoch必须等于ceil(num_samples / batch_size),所以如果数据集有1500个样本,steps_per_epoch应该等于1500。我还将LSTM滑动窗口从48减少到24
steps_per_epoch:整数。在从生成器中yield出样本批次之前,总共需要的步骤数(样本批次)以完成一个epoch并开始下一个epoch。通常应等于ceil(num_samples / batch_size)。对于Sequence是可选的:如果未指定,将使用len(generator)作为步骤数。
回答:
生成器已经返回批次。
每次yield
都是一个批次。完全由您决定如何设计生成器来按您想要的方式处理批次。
在您的代码中,批量大小是n_step
。