Python 使用fit_生成器和TFR记录训练Keras模型
我想和Keras一起训练我的ConvNet。在一些教程之后,我写了这样的东西 我不知道它是否好,尤其是我对使用发电机来训练我的模型有一些怀疑 之前,我用numpy数组生成器为训练过程提供了数据,但我读到可以使用tfrecords来提高性能 我第一次在下面的Python 使用fit_生成器和TFR记录训练Keras模型,python,tensorflow,keras,conv-neural-network,Python,Tensorflow,Keras,Conv Neural Network,我想和Keras一起训练我的ConvNet。在一些教程之后,我写了这样的东西 我不知道它是否好,尤其是我对使用发电机来训练我的模型有一些怀疑 之前,我用numpy数组生成器为训练过程提供了数据,但我读到可以使用tfrecords来提高性能 我第一次在下面的create\u dataset函数中将张量转换为numpy数组(在“生成”它们之前),但后来我读到了这一点 实际上,有一种更有效的方法可以使用数据集,而无需 将张量转换为numpy数组 因此,我尝试使用 input\u image=tf.ke
create\u dataset
函数中将张量转换为numpy数组(在“生成”它们之前),但后来我读到了这一点
实际上,有一种更有效的方法可以使用数据集,而无需
将张量转换为numpy数组
因此,我尝试使用
input\u image=tf.keras.input(tensor=x)
和model.compile(optimizer=optimizer,loss=compute\u loss,target\u tensors=[y])
在此之前,我没有在model.compile
或tensor=x
内部tf.keras.Input
(我只指定了输入形状)中使用target\u张量
现在训练进行得很快,但我怀疑有些地方出了差错。你能帮我吗
编辑:如果我直接将数据集放入fit\u generator
中,我将获得以下信息:
>>> train(model, DataGenerator, filepath_checkpoint="weights-best-tiny-test.hdf5")
Epoch 1/5000
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "tiny.py", line 239, in train
model.fit_generator(generator=training_generator,validation_data=validation_generator, epochs=5000, max_queue_size=100, steps_per_epoch=TRAINING_STEPS, validation_steps=VALIDATION_STEPS, callbacks=callbacks_list)
File "C:\Program Files\Python35\lib\site-packages\tensorflow\python\keras\engine\training.py", line 1586, in fit_generator
steps_name='steps_per_epoch')
File "C:\Program Files\Python35\lib\site-packages\tensorflow\python\keras\engine\training_generator.py", line 211, in model_iteration
batch_data = _get_next_batch(output_generator, mode)
File "C:\Program Files\Python35\lib\site-packages\tensorflow\python\keras\engine\training_generator.py", line 323, in _get_next_batch
generator_output = next(output_generator)
File "C:\Program Files\Python35\lib\site-packages\tensorflow\python\keras\utils\data_utils.py", line 767, in get
six.reraise(*sys.exc_info())
File "C:\Program Files\Python35\lib\site-packages\six.py", line 693, in reraise
raise value
File "C:\Program Files\Python35\lib\site-packages\tensorflow\python\keras\utils\data_utils.py", line 743, in get
inputs = self.queue.get(block=True).get()
File "C:\Program Files\Python35\lib\multiprocessing\pool.py", line 644, in get
raise self._value
File "C:\Program Files\Python35\lib\multiprocessing\pool.py", line 119, in worker
result = (True, func(*args, **kwds))
File "C:\Program Files\Python35\lib\site-packages\tensorflow\python\keras\utils\data_utils.py", line 680, in next_sample
return six.next(_SHARED_SEQUENCES[uid])
TypeError: 'Iterator' object is not an iterator
列车(型号、数据生成器、文件路径\u检查点=“weights best tiny test.hdf5”)
纪元1/5000
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
列车中第239行的文件“tiny.py”
model.fit\u生成器(生成器=培训\u生成器,验证\u数据=验证\u生成器,历元数=5000,最大队列大小=100,每个历元的步骤=培训\u步骤,验证\u步骤=验证\u步骤,回调=回调\u列表)
文件“C:\Program Files\Python35\lib\site packages\tensorflow\python\keras\engine\training.py”,第1586行,在fit\U生成器中
步骤(名称=“每个时代的步骤”)
模型迭代中的文件“C:\Program Files\Python35\lib\site packages\tensorflow\python\keras\engine\training\u generator.py”,第211行
批处理数据=\u获取\u下一批(输出\u生成器,模式)
文件“C:\Program Files\Python35\lib\site packages\tensorflow\python\keras\engine\training\u generator.py”,第323行,在下一批中
发电机输出=下一个(输出发电机)
get中的文件“C:\Program Files\Python35\lib\site packages\tensorflow\python\keras\utils\data\u utils.py”,第767行
六、重放(*sys.exc_info())
文件“C:\Program Files\Python35\lib\site packages\six.py”,第693行,在reraise中
增值
get中的文件“C:\Program Files\Python35\lib\site packages\tensorflow\python\keras\utils\data\u utils.py”,第743行
inputs=self.queue.get(block=True).get()
get中第644行的文件“C:\Program Files\Python35\lib\multiprocessing\pool.py”
提升自我价值
worker中第119行的文件“C:\Program Files\Python35\lib\multiprocessing\pool.py”
结果=(True,func(*args,**kwds))
文件“C:\Program Files\Python35\lib\site packages\tensorflow\python\keras\utils\data\u utils.py”,第680行,在下一个示例中
返回六个。下一个(\u共享\u序列[uid])
TypeError:“迭代器”对象不是迭代器
您能更具体地说明您的问题吗?这个代码有效吗?是的,它有效,但我不知道它是否有效。让我怀疑的是,培训的效果非常快。我想确保我的数据集的所有图像都真正传递给了训练过程。Keras处理迭代,所以你不需要使用数据集迭代器。同时粘贴您的回溯谢谢@Sharky。我没有错误,我只是想知道我的程序是否做了我应该做的事情。不适合?生成器需要迭代器才能工作?不,它不需要迭代器,但别忘了设置批/历元大小。您需要设置每个历元的步长。数据集操作、洗牌、重复等的顺序错误。请阅读更多内容,您能更具体地说明您的问题吗?这个代码有效吗?是的,它有效,但我不知道它是否有效。让我怀疑的是,培训的效果非常快。我想确保我的数据集的所有图像都真正传递给了训练过程。Keras处理迭代,所以你不需要使用数据集迭代器。同时粘贴您的回溯谢谢@Sharky。我没有错误,我只是想知道我的程序是否做了我应该做的事情。不适合?生成器需要迭代器才能工作?不,它不需要迭代器,但别忘了设置批/历元大小。您需要设置每个历元的步长。您的数据集操作顺序错误,如无序、重复等。请阅读更多
>>> train(model, DataGenerator, filepath_checkpoint="weights-best-tiny-test.hdf5")
Epoch 1/5000
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "tiny.py", line 239, in train
model.fit_generator(generator=training_generator,validation_data=validation_generator, epochs=5000, max_queue_size=100, steps_per_epoch=TRAINING_STEPS, validation_steps=VALIDATION_STEPS, callbacks=callbacks_list)
File "C:\Program Files\Python35\lib\site-packages\tensorflow\python\keras\engine\training.py", line 1586, in fit_generator
steps_name='steps_per_epoch')
File "C:\Program Files\Python35\lib\site-packages\tensorflow\python\keras\engine\training_generator.py", line 211, in model_iteration
batch_data = _get_next_batch(output_generator, mode)
File "C:\Program Files\Python35\lib\site-packages\tensorflow\python\keras\engine\training_generator.py", line 323, in _get_next_batch
generator_output = next(output_generator)
File "C:\Program Files\Python35\lib\site-packages\tensorflow\python\keras\utils\data_utils.py", line 767, in get
six.reraise(*sys.exc_info())
File "C:\Program Files\Python35\lib\site-packages\six.py", line 693, in reraise
raise value
File "C:\Program Files\Python35\lib\site-packages\tensorflow\python\keras\utils\data_utils.py", line 743, in get
inputs = self.queue.get(block=True).get()
File "C:\Program Files\Python35\lib\multiprocessing\pool.py", line 644, in get
raise self._value
File "C:\Program Files\Python35\lib\multiprocessing\pool.py", line 119, in worker
result = (True, func(*args, **kwds))
File "C:\Program Files\Python35\lib\site-packages\tensorflow\python\keras\utils\data_utils.py", line 680, in next_sample
return six.next(_SHARED_SEQUENCES[uid])
TypeError: 'Iterator' object is not an iterator