如何正确调用和设置Keras fit generator的参数
我是Keras新手,所以我对Keras文档和其他人使用如何正确调用和设置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_
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)`
我的问题是:
每个历元的步骤
validation\u steps
或nb\u val\u samples
x\u test[:100]
所示)进行了100次验证(如validation\u steps=100
所示),还是仅对每个样本进行了100次验证(因为验证生成器一次只生成一个样本)?为什么输出没有显示步骤数提前感谢。我遇到了这个问题,并在下面的代码中解决了它{在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
)