使用fit_generator分批训练模型

我的模型有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

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注