python - Keras fit_generator 一次训练一个样本,而我从生成器中生成多个样本

标签 python machine-learning keras deep-learning

我正在使用 keras 训练模型。我尝试了“fit”和“fit_generator”功能。我不明白为什么性能有很大差异,可能是我做错了什么。这是我第一次编写batch_generator代码。

给定批量大小为 10,我观察到的是使用函数时 -

适合:训练速度更快(每个时期大约 3 分钟),详细计数随着批处理大小的倍数增加(此处为 10)
样本- 80/7632 [................................] - 预计到达时间:4:31 - 损失:2.2072 - 加速:0.4375

fit_generator:训练速度慢得多(每轮 10 分钟),详细计数一次增加 1(不等于批量大小)
样本- 37/7632 [................................] - 预计到达时间:42:25 - 损失:2.1845 - 加速:0.3676

正如您所看到的,对于同一数据集的 fit_generator 来说,ETA 太高了。并且fit_generator每次增加1,而fit则以10的倍数增加

生成器:

def batch_generator(X ,y, batch_size=10):
    from sklearn.utils import shuffle

    batch_count = int(len(X) / batch_size)
    extra = len(X) - (batch_count * batch_size)

    while 1:
        #shuffle X and y
        X_train, y_train = shuffle(X,y)

        #Yeild Batches
        for i in range(1, batch_count):
            batch_start = (i-1) * batch_size
            batch_end = i * batch_size
            X_batch = X_train[batch_start: batch_end]
            y_batch = y_train[batch_start: batch_end]
            yield X_batch, y_batch

        #Yeild Remaining Data less than batch size
        if(extra > 0):
            batch_start = batch_count * batch_size
            X_batch = X_train[batch_start: -1]
            y_batch = y_train[batch_start: -1]
            yield X_batch, y_batch

拟合函数:

model.fit_generator(batch_generator(X, y, 10),
                    verbose = 1,
                    samples_per_epoch = len(X),
                    epochs = 20,
                    validation_data = (X_test, y_test),
                    callbacks = callbacks_list)

谁能解释一下为什么会发生这种情况?

最佳答案

fit_generator 不使用样本,它使用步骤,您正在使用带有 samples_per_epoch 参数的旧 Keras API,这是不正确的并且会产生错误的结果。正确的 fit_generator 调用是:

model.fit_generator(batch_generator(X, y, 10),
                    verbose = 1,
                    steps_per_epoch = int(len(X) / batch_size),
                    epochs = 20,
                    validation_data = (X_test, y_test),
                    callbacks = callbacks_list)

steps_per_epoch 控制在声明纪元​​结束之前要使用多少步(调用生成器)。应将其设置为总样本数除以批量大小。对于fit_generator,进度条中的索引将引用步骤(批处理),而不是样本,因此您无法将它们直接与fit进度条中的索引进行比较。

关于python - Keras fit_generator 一次训练一个样本,而我从生成器中生成多个样本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56598285/

相关文章:

python - Flask:如何使用 flask 和 ctypes 将上传的文件作为二进制数组直接传递给 c 型 DLL?

python - 使用 MoviePy 修复未最终的 .flv 视频

Azure ML 上的 SQL 更新不起作用?

python - 猫图像 Keras 自动编码器的微调

python - 在 python matplotlib.dates 中绘制毫秒图

machine-learning - 分类和预测有什么区别?

matlab - 理解高斯混合模型的概念

python - 使用 Keras 生成 LSTM 文本 : What is diversity?

keras - Keras 的 OrderedEnqueuer 是否保证了批处理的顺序?

Python 请求 HTTP 响应 406