Python 3.x Keras model.fit_生成器引发迭代错误
我正在尝试从这个github repo中的ssd300_training.ipynb代码运行Win10系统上的SSD端口。 在训练模型和解决方案时,我遇到了一个“StopIteration”错误,通过我的一点研究,我建议在数据生成器函数中添加一个while True块。然而,我对代码的熟练程度还不够,因为它不像函数格式那样编写。 以下是数据生成器代码:Python 3.x Keras model.fit_生成器引发迭代错误,python-3.x,tensorflow,keras,Python 3.x,Tensorflow,Keras,我正在尝试从这个github repo中的ssd300_training.ipynb代码运行Win10系统上的SSD端口。 在训练模型和解决方案时,我遇到了一个“StopIteration”错误,通过我的一点研究,我建议在数据生成器函数中添加一个while True块。然而,我对代码的熟练程度还不够,因为它不像函数格式那样编写。 以下是数据生成器代码: # 6: Create the generator handles that will be passed to Keras' `fit_gen
# 6: Create the generator handles that will be passed to Keras' `fit_generator()` function.
train_generator = train_dataset.generate(batch_size=batch_size,
shuffle=True,
transformations=[ssd_data_augmentation],
label_encoder=ssd_input_encoder,
returns={'processed_images',
'encoded_labels'},
keep_images_without_gt=False)
val_generator = val_dataset.generate(batch_size=batch_size,
shuffle=False,
transformations=[convert_to_3_channels,
resize],
label_encoder=ssd_input_encoder,
returns={'processed_images',
'encoded_labels'},
keep_images_without_gt=False)
请问我如何才能添加一个while-True:loop,这样它就可以停止给出StopIteration错误了。以下是培训代码及其给出的错误:
initial_epoch = 0
final_epoch = 50
steps_per_epoch = 10
history = model.fit_generator(generator=train_generator,
steps_per_epoch=steps_per_epoch,
epochs=final_epoch,
callbacks=callbacks,
validation_data=val_generator,
validation_steps=ceil(val_dataset_size/batch_size),
initial_epoch=initial_epoch
)
错误:
Epoch 1/50
9/10 [==========================>...] - ETA: 24s - loss: 3.45 - ETA: 13s - loss: 3.45 - ETA: 9s - loss: 3.4506 - ETA: 6s - loss: 3.450 - ETA: 5s - loss: 3.450 - ETA: 3s - loss: 3.450 - ETA: 2s - loss: 3.450 - ETA: 1s - loss: 3.450 - ETA: 0s - loss: 3.4504
---------------------------------------------------------------------------
StopIteration Traceback (most recent call last)
<ipython-input-16-484d98ebb6b5> in <module>()
11 #callbacks=callbacks,
12 validation_data=val_generator,
---> 13 validation_steps=ceil(val_dataset_size/batch_size),
14 #initial_epoch=initial_epoch
15 )
c:\users\keboc\anaconda3\envs\tensorflow_1.8\lib\site-packages\keras\legacy\interfaces.py in wrapper(*args, **kwargs)
89 warnings.warn('Update your `' + object_name +
90 '` call to the Keras 2 API: ' + signature, stacklevel=2)
---> 91 return func(*args, **kwargs)
92 wrapper._original_function = func
93 return wrapper
c:\users\keboc\anaconda3\envs\tensorflow_1.8\lib\site-packages\keras\engine\training.py in fit_generator(self, generator, steps_per_epoch, epochs, verbose, callbacks, validation_data, validation_steps, class_weight, max_queue_size, workers, use_multiprocessing, shuffle, initial_epoch)
1413 use_multiprocessing=use_multiprocessing,
1414 shuffle=shuffle,
-> 1415 initial_epoch=initial_epoch)
1416
1417 @interfaces.legacy_generator_methods_support
c:\users\keboc\anaconda3\envs\tensorflow_1.8\lib\site-packages\keras\engine\training_generator.py in fit_generator(model, generator, steps_per_epoch, epochs, verbose, callbacks, validation_data, validation_steps, class_weight, max_queue_size, workers, use_multiprocessing, shuffle, initial_epoch)
228 val_enqueuer_gen,
229 validation_steps,
--> 230 workers=0)
231 else:
232 # No need for try/except because
c:\users\keboc\anaconda3\envs\tensorflow_1.8\lib\site-packages\keras\legacy\interfaces.py in wrapper(*args, **kwargs)
89 warnings.warn('Update your `' + object_name +
90 '` call to the Keras 2 API: ' + signature, stacklevel=2)
---> 91 return func(*args, **kwargs)
92 wrapper._original_function = func
93 return wrapper
c:\users\keboc\anaconda3\envs\tensorflow_1.8\lib\site-packages\keras\engine\training.py in evaluate_generator(self, generator, steps, max_queue_size, workers, use_multiprocessing, verbose)
1467 workers=workers,
1468 use_multiprocessing=use_multiprocessing,
-> 1469 verbose=verbose)
1470
1471 @interfaces.legacy_generator_methods_support
c:\users\keboc\anaconda3\envs\tensorflow_1.8\lib\site-packages\keras\engine\training_generator.py in evaluate_generator(model, generator, steps, max_queue_size, workers, use_multiprocessing, verbose)
325
326 while steps_done < steps:
--> 327 generator_output = next(output_generator)
328 if not hasattr(generator_output, '__len__'):
329 raise ValueError('Output of generator should be a tuple '
c:\users\keboc\anaconda3\envs\tensorflow_1.8\lib\site-packages\keras\utils\data_utils.py in get(self)
783 all_finished = all([not thread.is_alive() for thread in self._threads])
784 if all_finished and self.queue.empty():
--> 785 raise StopIteration()
786 else:
787 time.sleep(self.wait_time)
StopIteration:
1/50纪元
9/10[==============================预计到达时间:24s-损失:3.45-预计到达时间:13s-损失:3.45-预计到达时间:9s-损失:3.4506-预计到达时间:6s-损失:3.450-预计到达时间:5s-损失:3.450-预计到达时间:3s-损失:3.450-预计到达时间:2s-损失:3.450-预计到达时间:1s-损失:3.450-预计到达时间:0s-损失:3.4504
---------------------------------------------------------------------------
StopIteration回溯(最后一次调用)
在()
11#回调=回调,
12验证数据=val发生器,
--->13验证步骤=ceil(val数据集大小/批次大小),
14#初始纪元=初始纪元
15 )
包装中的c:\users\keboc\anaconda3\envs\tensorflow\u 1.8\lib\site packages\keras\legacy\interfaces.py(*args,**kwargs)
89警告。警告('更新您的`+对象\u名称+
90'`对Keras 2 API的调用:'+签名,stacklevel=2)
--->91返回函数(*args,**kwargs)
92包装器._原始函数=func
93返回包装器
c:\users\keboc\anaconda3\envs\tensorflow\u 1.8\lib\site packages\keras\engine\training.py in fit\u generator(self、generator、每个历元的步骤、历元、冗余、回调、验证数据、验证步骤、类权重、最大队列大小、工作者、使用多处理、无序、初始历元)
1413使用多处理=使用多处理,
1414洗牌=洗牌,
->1415初始_历元=初始_历元)
1416
1417@interfaces.legacy\u生成器\u方法\u支持
c:\users\keboc\anaconda3\envs\tensorflow\u 1.8\lib\site packages\keras\engine\training\u generator.py in fit\u generator(模型、生成器、每个历元的步骤、历元、冗余、回调、验证数据、验证步骤、类权重、最大队列大小、工作者、使用多处理、无序、初始历元)
228 val_enqueuer_gen,
229个验证步骤,
-->230名工人=0)
231其他:
232#不需要尝试/除了因为
包装中的c:\users\keboc\anaconda3\envs\tensorflow\u 1.8\lib\site packages\keras\legacy\interfaces.py(*args,**kwargs)
89警告。警告('更新您的`+对象\u名称+
90'`对Keras 2 API的调用:'+签名,stacklevel=2)
--->91返回函数(*args,**kwargs)
92包装器._原始函数=func
93返回包装器
评估生成器中的c:\users\keboc\anaconda3\envs\tensorflow\u 1.8\lib\site packages\keras\engine\training.py(self、生成器、步骤、最大队列大小、工作者、使用多处理、详细)
1467名工人=工人,
1468使用多处理=使用多处理,
->1469详细=详细)
1470
1471@interfaces.legacy\u生成器\u方法\u支持
c:\users\keboc\anaconda3\envs\tensorflow\u 1.8\lib\site packages\keras\engine\training\u generator.py in evaluate\u generator(模型、生成器、步骤、最大队列大小、工作人员、使用多处理、详细)
325
326当步骤完成时<步骤:
-->327发电机输出=下一个(发电机输出)
328如果不是HASTATR(发电机输出,'''.'透镜''.'':
329 raise VALUERROR('生成器的输出应为元组'
c:\users\keboc\anaconda3\envs\tensorflow\u 1.8\lib\site packages\keras\utils\data\u utils.py in get(self)
783 all_finished=all([not thread.is_alive(),用于self.\u threads中的线程])
784如果所有_都已完成且self.queue.empty():
-->785上升停止迭代()
786其他:
787时间。睡眠(自我等待时间)
停止迭代:
感谢您的帮助这里有一个类似的问题,如果您每次调用model.fit_generator时都在相同的样本数下引发StopIteration,则他们使用whileTrue:loop来解决该问题,然后再次检查您传递给fit_generator方法的生成器是否产生了与中指定的相同数量的样本“每历元步长”参数。这就是我这方面错误的原因。