为什么Tensorflow不能以正确的顺序执行tf.Session()中的语句?

时间:2019-07-15 16:04:15

标签: python tensorflow keras

似乎很长,但是大部分是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的原因是一团糟。同样,它也无法正确完成第一个纪元。

谢谢:-)

1 个答案:

答案 0 :(得分:0)

  

(1)为什么在开始计算损耗/精度之前要循环10次

摘自fit_generator的文档

  • max_queue_size:整数。生成器队列的最大大小。如果未指定,则max_queue_size将默认为10。
  

(2)为什么突然缺少“我在打印之前/之后打印”?

这可能与生成器和训练循环在不同的线程中执行这一事实有关。这可能导致消息以不同的顺序出现。

  • 工人:整数。使用基于进程的线程时,要启动的最大进程数。如果未指定,worker将默认为1。如果为0,将在主线程上执行生成器。
  

->出现异常:   图中的节点名称重复:tensors_1 / component_0'和IndexError从空列表中弹出。

这似乎与您在生成器中使用的tf操作有关。您可以将其作为预处理吗?即只需创建一个不依赖于Tensorflow API读取的新数据集即可。

在故障排除方法方面也有建议:我发现独立于模型测试生成器很有用。

例如,可以通过完全运行数据生成器来测试数据生成器,而不是馈入任何模型,只需确保生成的数组形状正确即可。特别是最后一批。

我相信,通过单批(甚至是单个示例)进给模型来测试模型并确保所有形状在fit上正确检出总是有用的。