如何正确调用和设置Keras fit generator的参数

如何正确调用和设置Keras fit generator的参数,keras,neural-network,Keras,Neural Network,我是Keras新手,所以我对Keras文档和其他人使用fit\u generator的例子感到困惑。当我用100个样本测试这段代码时(为了快速输出,实际的训练样本超过10k),批量大小为32,分两个阶段: # 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_

我是Keras新手,所以我对Keras文档和其他人使用
fit\u generator
的例子感到困惑。当我用100个样本测试这段代码时(为了快速输出,实际的训练样本超过10k),批量大小为32,分两个阶段:

# 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)`
我的问题是:

  • 这些参数及其提供的值是否正确

  • 我的模型在每一步都接受了32张图片和标签的训练;每一个历元训练100/32步

  • 我是否需要使用参数
    每个历元的步骤

  • 我应该使用哪个参数:
    validation\u steps
    nb\u val\u samples

  • 我的模型是否对验证生成器的所有100个样本(如
    x\u test[:100]
    所示)进行了100次验证(如
    validation\u steps=100
    所示),还是仅对每个样本进行了100次验证(因为验证生成器一次只生成一个样本)?为什么输出没有显示步骤数

  • 我的模型是否使用第一个历元的训练权重重新训练相同的数据,这就是为什么训练精度从第一个历元的0.45跳到第二个历元的0.9

  • 你能帮我回答上面的问题吗


    提前感谢。

    我遇到了这个问题,并在下面的代码中解决了它{在Keras 1.1.2中之前==>在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)
    
    查看您的代码,您只需要
    每个历元的步骤
    而不是
    每个历元的示例
    ,将
    nb\u历元
    更改为
    历元
    。我不完全理解您的代码或培训/验证设置(100个培训和验证示例?),最好在每篇文章中问一个问题,但我会尝试修复您的代码(当然未经测试):

    请记住,
    number\u of_steps==number\u of_samples//batch\u size
    如果100是
    num\u training\u samples
    ,那么
    number\u of_steps
    必须有一个非常小的
    batch\u size
    ,才能有意义:

    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
        )
    

    您正在使用哪个keras版本?嗨,kruxx,我正在使用keras 2.2.4感谢您的回复。我不知道为什么
    批量大小必须小才能有意义?我之所以使用批处理大小32,是因为这是Keras的默认值。虽然你没有回答我所有的问题,但我认为你已经纠正了我的代码,我从你的
    #新工作中学到了一些新东西!Keras 2.2.4 fit_generator
    ,我现在接受您的回答。谢谢!历元通常意味着您已将所有训练数据通过机器一次。你将有多个时代,直到你的准确度收敛(问题6)。您可以在一个批中执行一个历元(batch_size==num training samples),但大多数人将所有训练数据分成小批(batch size==所有训练数据的某些部分)。您应该更深入地研究如何将一批培训数据拆分为完整/小批量培训:对于验证,验证示例在机器中传递一次(就像验证历元(问题5)),但通常验证数据比培训示例小得多,因此您的部分设置让我有点困惑。这是一个工作示例(包含数据),您可以逐步了解,其中有关于数据布局的精确注释,您可以尝试不同的方法来打破它,调整您的思维模式:感谢您的澄清。我确实了解如何使用全套或小批量。我只是不确定我的模型(如我问题中的代码所指定的)是否每一步训练32个样本(因为我的fit_生成器一次只生成一个样本)。我想知道模型的机械装置是否等待发生器产生32个样本,然后再等待下一批?我想知道是什么触发模型等待并开始适应;以及生成器如何知道停止生成下一个样本。通常,处理(特别是在GPU上)是矢量化的,因此一小批输入被加载到内存中(作为张量或多维数组)并立即处理。对于发电机问题,请提出新问题或阅读发电机
    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
        )