我在tfrecord
文件中存储了一个大数据集,例如333,用于训练,因此我将数据分成多个文件,例如1024 tfrecords文件,而不是一个。我在tf.Dataset Api中使用了输入管道。喜欢:
ds= ds.TFRecordsDataset(files).shuffle().repeat().shuffle().repeat()
ds = ds.prefetch(1)
我有自己的生成器,生成batch_x, batch_y
。
我的问题是,仅当我在workers=0
中设置fit_generator()
时,代码才起作用。
每当我将其设置为大于0时,都会出现以下错误
ValueError:Tensor(“ PrefetchDataset:0”,shape =(),dtype = variant)必须与Tensor(“ Iterator:0”,shape =(),dtype = resource)来自同一张图。
他们说,还有workers =
0不够的含义的文档
如果为0,将在主线程上执行生成器。
我在github here中发现了类似的问题,但是还没有解决方案。
还有一个类似的问题发布在here上,但是我与众不同,因为我使用Keras而不是张量流,并且我没有使用tf.Graph().as_default()
。建议使用两个图形而不是一个图形,因此解决方案是删除tf.Graph().as_default()
。当我检查图形时,我注意到与我输入管道相关的所有map函数都在不同的graph(子图形)中,并且它不能附加到主图形上。如下所示:
我应该提到,这是一个两阶段的培训。首先,我建立了一个使用基于image_dataset的网络,该网络在imagene
t上进行了预训练,而我刚刚训练了分类器。数据集位于hdf5
文件中,可以放入内存。在第二阶段中,我在第一阶段中使用训练有素的网络,并在其上附加了一些块,并且我的数据集是tfrecod
文件,这就是为什么我在输入管道中使用tf.Dataset API
的原因。因此,在第一阶段的第一张图中不存在此新的输入管道。但这没关系,我只是将预处理网络用作基本模式,然后向其添加其他块。因此,这是全新的模型。
这是我想更改工作程序的主要原因,因为我的GPU利用率始终为零,这意味着CPU处于瓶颈,这意味着Cpu需要花费大量时间来提取数据。而且我的GPU一直在等待。这就是为什么训练需要一定的时间,例如9个小时。
任何人都可以解释错误的含义吗?