Jupyter Notebook中无法屏蔽TensorFlow警告的问题求助
问题背景
已尝试多种常规方法仍无法消除TensorFlow相关警告,包括:
warnings.filterwarnings('ignore')warnings.simplefilter('ignore')logging.getLogger('tensorflow').disabled = Truelogging.getLogger('tensorflow').setLevel(logging.ERROR)logging.disable(logging.WARNING)os.environ['PYTHONWARNING'] = 'ignore'os.environ['TF_CPP_MIN_LOG_LEVEL'] = 3
还修改了ipython_config.py、编写上下文管理器,以及尝试%%capture魔法命令(但会捕获所有输出,不符合需求)。
遇到的具体警告:
- 导入
spacy时的CPU优化提示:
2023-05-23 14:42:41.997371: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations. To enable the following instructions: AVX2 FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.
- 训练LSTM Keras模型时的大量调试信息:
2023-05-23 14:48:30.399777: I tensorflow/core/common_runtime/executor.cc:1197] [/device:CPU:0] (DEBUG INFO) Executor start aborting (this does not indicate an error and you can ignore this message): INVALID_ARGUMENT: You must feed a value for placeholder tensor 'gradients/split_2_grad/concat/split_2/split_dim' with dtype int32
可行解决方法
方法1:自定义stderr过滤器精准屏蔽目标日志
在Notebook开头执行以下代码,直接过滤TensorFlow的INFO级调试输出,同时保留其他正常内容:
import os import sys # 设置TensorFlow C++日志级别为ERROR os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' # 自定义stderr过滤类,屏蔽TensorFlow的INFO日志 class TensorFlowFilteredStderr: def __init__(self, original_stderr): self.original_stderr = original_stderr def write(self, data): # 过滤包含"tensorflow/core/"的INFO级日志 if not (data.startswith('20') and ': I ' in data and 'tensorflow/core/' in data): self.original_stderr.write(data) def flush(self): self.original_stderr.flush() sys.stderr = TensorFlowFilteredStderr(sys.stderr)
方法2:结合TensorFlow内置日志控制+Python日志配置
针对TensorFlow的Python日志和底层组件分别设置,实现更细粒度的控制:
import os import logging import tensorflow as tf # 屏蔽TensorFlow C++层的INFO、WARNING日志 os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' # 禁用TensorFlow Python日志的INFO及以下级别 tf.get_logger().setLevel('ERROR') # 单独屏蔽Executor组件的调试日志 logging.getLogger('tensorflow.core.common_runtime.executor').setLevel(logging.ERROR)
方法3:全局配置永久生效
修改jupyter_notebook_config.py(若不存在可通过jupyter notebook --generate-config生成),添加以下内容,每次启动Notebook自动生效:
c = get_config() c.NotebookApp.exec_lines = [ "import os; os.environ['TF_CPP_MIN_LOG_LEVEL']='3'", "import tensorflow as tf; tf.get_logger().setLevel('ERROR')", "import logging; logging.getLogger('tensorflow.core.common_runtime.executor').setLevel(logging.ERROR)" ]
说明
- 方法1通过精准匹配日志格式过滤目标内容,不会影响其他正常输出;
- 方法2利用TensorFlow自身的日志接口,适合需要保留部分警告的场景;
- 方法3实现全局配置,无需每次在Notebook中重复执行代码。
内容的提问来源于stack exchange,提问作者vudupins

