【问题标题】:How to call and set arguments correctly for Keras fit generator如何为 Keras fit 生成器正确调用和设置参数
【发布时间】:2019-10-01 00:54:14
【问题描述】:

我是 Keras 的新手,所以我对 Keras 文档和其他人使用 fit_generator 的示例感到困惑。当我用 100 个样本(为了快速输出。实际训练样本超过 10k)以 32 的批量大小测试 2 个 epoch:

# Create a generator that generates an image and a label one at a time (because loading all data into memory will freeze the laptop)

def generate_transform(imgs, lbls):
    while 1:       
        for i in range(len(imgs)):
            img = np.array(cv2.resize(imgs[i], (224, 224)))            
            lbl = to_categorical(lbls[i], num_classes=10)
            yield (img, lbl)  

history =  model.fit_generator(generate_transform(x[:100], y[:100]),
                                   steps_per_epoch=100/32,
                                   samples_per_epoch=100, 
                                   nb_epoch=2,
                                   validation_data=generate_transform(x_test[:100], y_test[:100]),
                                   validation_steps=100)
                                   # nb_val_samples=100?)

我收到了这个用户警告:

D:\Users\jason\AppData\Local\Continuum\Anaconda3\lib\site-packages\ipykernel_launcher.py:8: UserWarning: The semantics of the Keras 2 argument `steps_per_epoch` is not the same as the Keras 1 argument `samples_per_epoch`. `steps_per_epoch` is the number of batches to draw from the generator at each epoch. Basically steps_per_epoch = samples_per_epoch/batch_size. Similarly `nb_val_samples`->`validation_steps` and `val_samples`->`steps` arguments have changed. Update your method calls accordingly.

D:\Users\jason\AppData\Local\Continuum\Anaconda3\lib\site-packages\ipykernel_launcher.py:8: UserWarning: Update your `fit_generator` call to the Keras 2 API: `fit_generator(<generator..., steps_per_epoch=100, validation_data=<generator..., validation_steps=100, epochs=2)`

输出看起来像这样:

Epoch 1/2
100/100 [==============================] - 84s 836ms/step - loss: 3.0745 - acc: 0.4500 - val_loss: 2.3886 - val_acc: 0.0300
Epoch 2/2
100/100 [==============================] - 86s 864ms/step - loss: 0.3654 - acc: 0.9000 - val_loss: 2.4644 - val_acc: 0.0900

我的问题是:

  1. 我的调用对这些参数及其提供的值是否正确?

  2. 我的模型是否在每个步骤中使用 32 个图像和标签进行了训练?并且每个 epoch 训练了 100/32 步?

  3. 我需要使用参数steps_per_epoch吗?

  4. 我应该使用哪个参数:validation_stepsnb_val_samples

  5. 我的模型是否将验证生成器的所有 100 个样本(如 x_test[:100] 所示)验证了 100 次(如 validation_steps=100 所示),还是每个样本仅验证 100 次(因为验证生成器一次只能产生一个样本)?为什么输出没有显示步数?

  6. 我的模型是否使用第一个 epoch 的训练权重再次重新训练相同的数据,这就是为什么训练精度从第一个 epoch 的 0.45 跃升至第二个 epoch 的 0.9?

您能帮我解决以上问题吗?

提前致谢。

【问题讨论】:

  • 你用的是哪个keras版本?
  • 嗨 kruxx,我使用的是 Keras 2.2.4

标签: keras neural-network


【解决方案1】:

我遇到了这个问题并在下面的代码中解决了它{before in Keras 1.1.2 ==> after in Keras 2.2.4}:

294 # Old Keras==1.1.2 fit_generator
295 # history = model.fit_generator(
296 #    train_data_generator.get_data(),
297 #    samples_per_epoch=train_data_generator.get_num_files(),
298 #    nb_epoch=config["num_epochs"],
300 #    verbose=1,
301 #    validation_data=validation_data_generator.get_data(should_shuffle=False),
302 #    nb_val_samples=validation_data_generator.get_num_files(),
303 #    nb_worker=2,
304 #    max_q_size=batch_size,
305 #    pickle_safe=True)
306
307 # New working! Keras 2.2.4 fit_generator        
309 history = model.fit_generator(
310      train_data_generator.get_data(),
312      verbose=1,
313      validation_data=validation_data_generator.get_data(should_shuffle=False),
314      steps_per_epoch=train_data_generator.get_num_files() // batch_size,
315      epochs=config["num_epochs"],
316      validation_steps=validation_data_generator.get_num_files() // batch_size,
317      workers=2, use_multiprocessing=True,
318      max_queue_size=batch_size)

查看您的代码,您只需要steps_per_epoch 而不是samples_per_epoch,将nb_epoch 更改为epochs。我不完全理解您的代码或培训/验证设置(100 个培训和验证样本?),最好在每个帖子中问一个问题,但我会尝试修复您的代码(当然未经测试):

请记住,number_of_steps == number_of_samples // batch_size,如果 100 是 num_training_samples,则您必须有一个非常小的 batch_size 才能使 number_of_steps 有意义:

history =  model.fit_generator(
    generate_transform(x[:100], y[:100]), # training data generator
    verbose=1,                  
    val_data=generate_transform(x_test[:100], y_test[:100]), # validation data generator
    steps_per_epoch=100 // batch_size, # 100 is num_training_samples, divided by batch_size == steps_per_epoch
    epochs=2,
    val_steps=100 // batch_size # 100 is num_val_samples, divided by batch_size == val_steps
    )

【讨论】:

  • 感谢您的回复。我不确定为什么 batch_size 必须很小才有意义?我使用 32 的批量大小的原因是因为它是 Keras 的默认值。虽然您没有解决我所有的问题,但我认为您已经更正了我的代码,并且我从您的# New working! Keras 2.2.4 fit_generator 中学到了一些新东西,我暂时接受您的回答。
  • 谢谢!一个时期通常意味着您已经将所有的训练数据通过机器一次。您将有多个时期,直到您的准确性收敛(问题 6)。您可以在一批中执行 1 个时期(batch_size == num 个训练样本),但大多数人将所有训练数据划分为小批量(批量大小 == 所有训练数据的一些划分)。您应该更深入地研究如何将一批训练数据拆分为完整/小批量训练:datascience.stackexchange.com/questions/16807/…
  • 对于验证,验证示例通过机器一次(如验证时期(问题 5))但通常验证数据比训练示例小得多,因此您的部分设置有点让我困惑。这是一个您可以逐步完成的工作示例(带有数据),有关于数据的确切布局方式的 cmets,您可以尝试不同的方法来打破它,调整您的心智模型:github.com/ruohoruotsi/LSTM-Music-Genre-Classification/blob/…
  • 感谢您的澄清。我确实了解使用全套或小批量。我只是不确定我的模型(如我的问题中的代码所指定)是否每一步训练了 32 个批次(因为我的 fit_generator 一次只产生一个样本)。我想知道模型的机制是否等待生成器在开始拟合之前生成了 32 个样本,然后再次等待下一批?我想知道是什么触发了模型等待并开始拟合;以及生成器如何知道停止产生下一个样本。
  • 一般来说,处理(尤其是在 GPU 上)是矢量化的,因此一小批输入被加载到内存中(作为张量,也就是多维数组)并立即处理。对于生成器问题,请提出新问题或阅读生成器stanford.edu/~shervine/blog/…
猜你喜欢
  • 2018-04-27
  • 2012-12-03
  • 1970-01-01
  • 1970-01-01
  • 2020-12-25
  • 1970-01-01
  • 2014-08-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多