【问题标题】:Keras fit_generator is training one sample at a time, while i am yeilding more than one sample from generatorKeras fit_generator 一次训练一个样本,而我从生成器中生成多个样本
【发布时间】:2019-10-29 02:21:01
【问题描述】:

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

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

fit:它训练得更快(每个 epoch 大约 3 分钟),随着批量大小的倍数增加详细计数(这里是 10)
样本- 80/7632 [.......................] - ETA:4:31 - 损失:2.2072 - acc:0.4375

fit_generator:训练速度慢得多(每个 epoch 10 分钟),详细计数每次增加 1(不等于批量大小)
样本- 37/7632 [.......................] - ETA:42:25 - 损失:2.1845 - acc: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 参数是什么?它应该被称为steps_per_epoch
  • samples_per_epochs 用于告诉模型它期望看到多少样本才能得出结论,它已经完成了一个 epoch。

标签: python machine-learning keras deep-learning


【解决方案1】:

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 控制在宣布 epoch 结束之前使用多少步(调用生成器)。它应该设置为除以批量大小的总样本数。对于fit_generator,进度条中的索引指的是步骤(批次),而不是样本,因此您不能直接将它们与fit的进度条中的索引进行比较。

【讨论】:

  • samples_per_epochs 用于告诉模型它期望看到多少样本才能得出结论,它已经完成了一个 epoch。如果我使用steps_per_epoch,它会丢失最后一批样本数大于batch_size的批次吗?
  • @Piyushjain 我认为你的评论应该进入你的问题,而不是我的回答:),但是你是对的。
  • 哦,对了:p,这是我关于 stackoverflow 的第一个问题。对不起
  • @Piyushjain 不用担心,答案的 cmets 应该用于澄清答案本身。
猜你喜欢
  • 2023-03-10
  • 1970-01-01
  • 2019-02-09
  • 2019-11-13
  • 1970-01-01
  • 1970-01-01
  • 2012-04-22
  • 2018-12-14
  • 1970-01-01
相关资源
最近更新 更多