Tensorflow 导致日志消息加倍

Posted

技术标签:

【中文标题】Tensorflow 导致日志消息加倍【英文标题】:Tensorflow causes logging messages to double 【发布时间】:2016-02-13 06:11:53 【问题描述】:

所以我在玩他们昨天发布的 Google 的 Tensorflow 库,遇到了一个烦人的错误,一直困扰着我。

我所做的是像往常一样设置 python 日志记录功能,结果是,如果我导入 tensorflow 库,控制台中的所有消息都开始加倍。有趣的是,如果您只使用 logging.warn/info/..() 函数,这不会发生。

将消息加倍的代码示例:

import tensorflow as tf
import logging

logging.warn('test')

确实将所有消息加倍的代码示例:

import tensorflow as tf
import logging

logger = logging.getLogger('TEST')
ch = logging.StreamHandler()
logger.addHandler(ch)

logger.warn('test')

现在,我是一个简单的人。我喜欢logging 的功能,所以我使用它。使用logger 对象和添加StreamHandler 的设置是我在查看其他人是如何做到这一点的时候发现的,但它看起来符合这个东西的用途。但是,我对日志库没有深入的了解,因为它总是能正常工作。

因此,任何解释为什么会发生消息翻倍的帮助都会非常有帮助。

我正在使用带有 Python 2.7.6 的 Ubuntu 14.04.3 LTS,但在我尝试的所有 Python 2.7 版本中都会出现错误。

【问题讨论】:

我很难在 ubuntu 14.04 上用 python 2.7.6 复制这个:python testlog.py WARNING:root:test 你能提供更多关于你如何安装 tf 的细节吗? 啊!您的示例代码中有一个错字。最后一行应该是 logger.warn('test') 而不是 logging.warn。现在我已经复制了它。答案更清楚了 - 等等。 【参考方案1】:

我得到这个输出:

test
WARNING:TEST:test

Tensorflow使用了日志框架,并设置了自己的处理程序,所以当你记录时,默认情况下,它会传播到 tensorflow 内的父日志处理程序。您可以通过设置更改此行为:

logger.propagate = False

另见duplicate output in simple python logging configuration

跟进:这是 tensorflow 使用日志包的方式的意外副作用。我已经在 HEAD 将其更改为以“tensorflow”为名的内部记录器,以避免这种污染。应该在一天左右的时间内就在github头上。同时, logger.propagate 解决方案将起作用,并且一旦修复完成就不会中断,因此您应该可以放心使用。再次感谢您发现这一点!

跟进-跟进: 以TensorFlow 1.14 开头直接暴露logger

import tensorflow as tf

logger = tf.get_logger()

【讨论】:

(我将检查这是否是真正的意图或错误 - 我从未遇到过或想太多。) Tensorflow 没有以标准的 getLogger(name) 方式使用日志记录包,这就是您看到命名空间冲突的原因。我会为此发送一个补丁,看看我们是否可以让它更快乐。感谢您提出这个问题! 在 REPL 中仍然会发生类似早期的倍增效应。不是问题,但可能会令人惊讶。我写了一点post on logging 并在那里更多地描述了这种现象。 @dga 这不应该被修复吗?在 TensorFlow 2.X 中再次遇到该问题【参考方案2】:

logger.propagate = False 解决了我的问题。我认为这是张量流的一个错误

【讨论】:

你的答案和接受的答案有什么区别?

以上是关于Tensorflow 导致日志消息加倍的主要内容,如果未能解决你的问题,请参考以下文章

[TensorFlow]Tensor维度理解

Tensor--tensorflow的数据类型

tensorflow怎么返回一个tensor中的数据

tensorflow::Tensor 到 python Tensor 或 numpy.nd_array

如何理解TensorFlow中的tensor

AI - TensorFlow Tensor