首页 > 解决方案 > 使用 fit_generator 批量训练模型

问题描述

我的模型有 100 000 个图像训练样本,如何修改下面的代码以批量训练它?使用 model.fit_generator 我必须在生成器函数中指定它:

def data_generator(descriptions, features, n_step, max_sequence):
    # loop until we finish training
    while 1:
        # loop over photo identifiers in the dataset
        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]
                # retrieve text input
                desc = descriptions[j]
                # generate input-output pairs
                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 this batch of samples to the model
            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:整数。在声明一个时期完成并开始下一个时期之前从生成器产生的步骤总数(样本批次)。它通常应该等于 ceil(num_samples / batch_size)。序列可选:如果未指定,将使用 len(generator) 作为多个步骤。

标签: tensorflowmachine-learningkeras

解决方案


生成器已经返回批次。

每一个yield都是一批。完全取决于您以您想要的方式设计带有批次的生成器。

在您的代码中,批量大小为n_step.


推荐阅读