我有一个大数据集存储在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
in fit_generator()
.
每当我将其设置为大于 0 时,都会出现以下错误
ValueError: Tensor("PrefetchDataset:0", shape=(), dtype=variant) 必须与 Tensor("Iterator:0", shape=(), dtype=resource) 来自同一个图。
以及有关如果的含义的文档workers =
他们说 0 还不够
如果为 0,将在主线程上执行生成器。
我在github上发现了类似的问题here https://github.com/keras-team/keras/issues/10110,但还没有解决方案。
还有人发布了另一种类似的问题here https://stackoverflow.com/questions/42616625/valueerror-tensor-must-be-from-the-same-graph-as-tensor-with-bidirectinal-rnn-i,但我不同,因为我使用 Keras 而不是张量流,并且我没有使用 withtf.Graph().as_default()
。建议有两张图而不是一张,所以解决方案是删除tf.Graph().as_default()
。当我检查图表时,我注意到与我的输入管道相关的所有映射函数位于不同的图表(子图)中,并且它无法附加到主图表。像下面这样:
我应该提到的是,这是一个两个阶段的培训。首先,我构建一个采用基于图像的数据集的网络,并且该网络经过预训练imagene
t,我刚刚训练了我的分类器。数据集位于hdf5
文件并且它可以适合内存。在第二阶段,我在第一阶段使用经过训练的网络,并向其附加一些块,这里的数据集是tfrecod
文件这就是我使用的原因tf.Dataset API
对于我的输入管道。因此,这个新的输入管道不存在于第一阶段的第一张图中。但这应该不重要,我只是使用预处理的网络作为基本模式,然后添加不同的块。所以它是全新的模型。
我想改变worker的主要原因是,因为我的GPU utils总是为零,这意味着CPU是瓶颈,这意味着CPU需要花费很多时间来提取数据。我的 GPU 一直在等待。这就是为什么训练需要很长时间,比如一个 epoch 需要 9 个小时。
任何人都可以解释该错误的含义吗?