似乎很长,但是大部分是print()的输出。
我正在使用自定义生成器函数为我的keras .fit_generator()
函数提供数据。在生成器函数中,我只是做了一些数据扩充。在此函数结束时,我打开一个tf.Session()
以最终产生一批数据。
def iAmTheCustomGeneratorFunction(...):
... data augemenation...
next_batch = iterator.get_next()
with tf.Session() as sess:
count = 0
while True:
try:
features1, features2, labels = sess.run(next_batch)
print('\n\n I am a print before yield. ' + str(count))
yield [features1, features2], labels
print(' I am a print behind yield. ' + str(count))
count = count +1
except tf.errors.OutOfRangeError:
print('end of the dataset')
break
运行代码时,出现以下问题。我将问题写在输出后面作为注释(见下文)。 我在控制台中得到了输出:
Epoch 1/1
I am a print before yield. Index: 0
I am a print behind yield. Index: 0
...
I am a print before yield. Index: 9
I am a print behind yield. Index: 9
# (1) Why does it loop 10 times before it starts with calculating loss/accuracy
...
# -> This is what the output should look like
I am a print before yield. Index: 10
1/58 [......]- ETA: 12:22 - loss: 20.6840 - acc: 0.20
I am a print behind yield. Index: 10
...
I am a print before yield. Index: 56
47/58 [......]- ETA: 11:00 - loss: 18.6840 - acc: 0.42
I am a print behind yield. Index: 56
# (2) Why suddenly the "I am print before/behind yield" is missing?
48/58 [......]- ETA: 10:22 - loss: 16.6840 - acc: 0.53
...
52/58 [......]- ETA: 9:22 - loss: 15.6840 - acc: 0.54
# (3) Why suddenly information about accuracy/loss is missing?
I am a print before yield. Index: 57
I am a print behind yield. Index: 57
...
I am a print before yield. Index: 61
I am a print behind yield. Index: 61
...
# -> Now it works as usual
I am a print before yield. Index: 62
53/58 [......]- ETA: 08:22 - loss: 14.6840 - acc: 0.55
I am a print behind yield. Index: 62
...
I am a print before yield. Index: 66
57/58 [......]- ETA: 07:22 - loss: 12.6840 - acc: 0.58
I am a print behind yield. Index: 66
I am a print before yield. Index: 67
# -> Here arises the Exception:
Duplicate node name in graph: tensors_1/component_0' and IndexError pop from empty list`
我不明白的是为什么tensorflow不能按正确的顺序打印所有内容,而且还从索引10开始,首先计算损耗和准确性(请参见上文)。根据我的意见,这个pop from empty list exception
的原因是一团糟。同样,它也无法正确完成第一个纪元。
谢谢:-)
答案 0 :(得分:0)
(1)为什么在开始计算损耗/精度之前要循环10次
摘自fit_generator
的文档
(2)为什么突然缺少“我在打印之前/之后打印”?
这可能与生成器和训练循环在不同的线程中执行这一事实有关。这可能导致消息以不同的顺序出现。
->出现异常: 图中的节点名称重复:tensors_1 / component_0'和IndexError从空列表中弹出。
这似乎与您在生成器中使用的tf操作有关。您可以将其作为预处理吗?即只需创建一个不依赖于Tensorflow API读取的新数据集即可。
在故障排除方法方面也有建议:我发现独立于模型测试生成器很有用。
例如,可以通过完全运行数据生成器来测试数据生成器,而不是馈入任何模型,只需确保生成的数组形状正确即可。特别是最后一批。
我相信,通过单批(甚至是单个示例)进给模型来测试模型并确保所有形状在fit
上正确检出总是有用的。