Tensorflow log 日志级别设置

本文详细解析了TensorFlow中os.environ[TF_CPP_MIN_LOG_LEVEL]的不同设置对日志输出的影响,通过测试代码展示了如何调整日志等级来减少不必要的信息输出,提高代码运行时的清晰度。

查阅很多资料,只显示os.environ["TF_CPP_MIN_LOG_LEVEL"]等级可为1,2,3级别,
级别不同,输出的显示不同, 但是具体什么不同,没有说明,下面借助测试Tensorflow测试GPU代码以及输出阐述下个人的理解

大多资料能查阅到:

log 日志级别设置:

  • os.environ[“TF_CPP_MIN_LOG_LEVEL”]=‘1’ # 这是默认的显示等级,显示所有信息
  • os.environ[“TF_CPP_MIN_LOG_LEVEL”]=‘2’ # 只显示 warning 和 Error
  • os.environ[“TF_CPP_MIN_LOG_LEVEL”]=‘3’ # 只显示 Error

个人理解:
Tensorflow默认的logging information太多,去除掉多余的log信息,只保留所需部分,例如如下测试是否调用gpu代码

测试代码:
测试Tensorflow 调用gpu还是cpu,查看输出信息是否简化

import os
# os.environ["TF_CPP_MIN_LOG_LEVEL"] = "1"  # 这是默认的显示等级,显示所有信息
# os.environ["TF_CPP_MIN_LOG_LEVEL"] = '2'  # 只显示 warning 和 Error
os.environ["TF_CPP_MIN_LOG_LEVEL"] = '3'  # 只显示 Error

import tensorflow as tf


with tf.device('/cpu:0'):
    a = tf.constant([1.0, 2.0, 3.0], shape=[3], name='a')
    b = tf.constant([1.0, 2.0, 3.0], shape=[3], name='b')
with tf.device('/gpu:1'):
    c = a + b

# 注意:allow_soft_placement=True表明:计算设备可自行选择,如果没有这个参数,会报错。
# 因为不是所有的操作都可以被放在GPU上,如果强行将无法放在GPU上的操作指定到GPU上,将会报错。
sess = tf.Session(config=tf.ConfigProto(allow_soft_placement=True, log_device_placement=True))
sess.run(tf.global_variables_initializer())
print(sess.run(c))

os.environ["TF_CPP_MIN_LOG_LEVEL"] = "1"的结果显示:

(tf) dl@dl:~/Lebhoryi$ python test_gpu.py 
2019-02-26 09:42:08.102487: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE4.1 instructions, but these are available on your machine and could speed up CPU computations.
2019-02-26 09:42:08.102516: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE4.2 instructions, but these are available on your machine and could speed up CPU computations.
2019-02-26 09:42:08.102522: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use AVX instructions, but these are available on your machine and could speed up CPU computations.
2019-02-26 09:42:08.102528: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use AVX2 instructions, but these are available on your machine and could speed up CPU computations.
2019-02-26 09:42:08.102535: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use FMA instructions, but these are available on your machine and could speed up CPU computations.
2019-02-26 09:42:08.216220: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:893] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2019-02-26 09:42:08.216546: I tensorflow/core/common_runtime/gpu/gpu_device.cc:955] Found device 0 with properties: 
name: GeForce GTX 1080 Ti
major: 6 minor: 1 memoryClockRate (GHz) 1.645
pciBusID 0000:01:00.0
Total memory: 10.90GiB
Free memory: 10.55GiB
2019-02-26 09:42:08.216563: I tensorflow/core/common_runtime/gpu/gpu_device.cc:976] DMA: 0 
2019-02-26 09:42:08.216569: I tensorflow/core/common_runtime/gpu/gpu_device.cc:986] 0:   Y 
2019-02-26 09:42:08.216578: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1045] Creating TensorFlow device (/gpu:0) -> (device: 0, name: GeForce GTX 1080 Ti, pci bus id: 0000:01:00.0)
Device mapping:
/job:localhost/replica:0/task:0/gpu:0 -> device: 0, name: GeForce GTX 1080 Ti, pci bus id: 0000:01:00.0
2019-02-26 09:42:08.307192: I tensorflow/core/common_runtime/direct_session.cc:300] Device mapping:
/job:localhost/replica:0/task:0/gpu:0 -> device: 0, name: GeForce GTX 1080 Ti, pci bus id: 0000:01:00.0

init: (NoOp): /job:localhost/replica:0/task:0/gpu:0
2019-02-26 09:42:08.308285: I tensorflow/core/common_runtime/simple_placer.cc:872] init: (NoOp)/job:localhost/replica:0/task:0/gpu:0
add: (Add): /job:localhost/replica:0/task:0/gpu:0
2019-02-26 09:42:08.308302: I tensorflow/core/common_runtime/simple_placer.cc:872] add: (Add)/job:localhost/replica:0/task:0/gpu:0
b: (Const): /job:localhost/replica:0/task:0/cpu:0
2019-02-26 09:42:08.308312: I tensorflow/core/common_runtime/simple_placer.cc:872] b: (Const)/job:localhost/replica:0/task:0/cpu:0
a: (Const): /job:localhost/replica:0/task:0/cpu:0
2019-02-26 09:42:08.308319: I tensorflow/core/common_runtime/simple_placer.cc:872] a: (Const)/job:localhost/replica:0/task:0/cpu:0
[2. 4. 6.]

可以看到有很多的log信息,但是我们并不想看见它,于是如下,2和3级别的显示结果一样:

os.environ["TF_CPP_MIN_LOG_LEVEL"] = "2"结果显示:

(tf) dl@dl:~/Lebhoryi$ python test_gpu.py 
Device mapping:
/job:localhost/replica:0/task:0/gpu:0 -> device: 0, name: GeForce GTX 1080 Ti, pci bus id: 0000:01:00.0
init: (NoOp): /job:localhost/replica:0/task:0/gpu:0
add: (Add): /job:localhost/replica:0/task:0/gpu:0
b: (Const): /job:localhost/replica:0/task:0/cpu:0
a: (Const): /job:localhost/replica:0/task:0/cpu:0
[2. 4. 6.]

可以明显的看到,输出只剩下了我们想要的那一部分.这就是os.environ["TF_CPP_MIN_LOG_LEVEL"]的简单用法.

==== update ====

经测试,上述代码同样适用于cpu, 级别更改, 输出效果简化.

<think>首先,用户的问题是:“请问深度学习 训练日志分析 调试方法”。这翻译成“请问深度学习训练日志分析调试方法”。用户意图是查找与深度学习相关的日志信息,用于调试、训练过程监控或性能分析。 系统级指令: - 所有行内数学表达式必须使用$...$格式。 - 独立公式使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 在回答中引用的段落末尾自然地添加引用标识,如[^1]。 - 回答结构清晰,帮助用户逐步解决问题。 - 参考站内引用:[^1]、[^2]、[^3]。 站内引用: - [^1]: 关于性能优化和调试,确保系统高效稳定运行。包括代码优化、数据库优化等。 - [^2]: 在编写和调试训练脚本时,确保路径正确、模型加载正确,处理错误并提供调试信息。 - [^3]: 描述训练日志的变化:随着训练次数增加,准确率和损失值的变化,显示训练集和测试集的性能。 用户意图是深度学习训练日志分析调试方法。我需要基于这些引用构建回答。 回答结构: 1. **介绍**:解释深度学习训练日志的重要性。 2. **逐步方法**: - 如何收集日志。 - 如何分析日志(如准确率、损失值)。 - 调试方法(如错误处理、性能优化)。 3. **参考引用**:在相关部分末尾添加引用标识。 4. **生成相关问题**:在结尾添加相关问题。 关键点从引用中提取: - 从[^3]:日志包括训练集和测试集的准确率和损失值,用于监控训练过程。 - 从[^2]:调试涉及脚本错误处理、路径检查、提供调试信息。 - 从[^1]:性能优化包括代码、数据库等,但针对深度学习,需调整到模型训练。 LaTeX使用: - 行内数学:如损失函数$L(\theta)$,准确率$acc$。 - 独立公式:如果需要,例如定义损失函数。 相关问题生成: - 类似示例中的格式,生成3-4个相关问题。 完整回答: - 开头:直接回答问题。 - 主体:分步骤解释。 - 结尾:相关问题。 最终输出: - 回答部分。 - §§相关问题§§部分。</think>### 深度学习训练日志分析调试方法 在深度学习模型训练过程中,日志分析是监控性能、调试错误和优化模型的关键环节。日志记录了训练迭代的详细信息,如损失值、准确率、学习率等,帮助开发者识别过拟合、欠拟合、梯度消失等问题。以下我将逐步介绍日志分析调试方法,结合实际场景,确保回答清晰可靠。 #### 1. **日志收集与内容解析** 首先,训练日志通常由训练脚本生成,包含关键指标的变化趋势。例如: - 损失值(loss)反映模型预测误差,常用交叉熵或均方误差函数,如$L(\theta) = -\sum y \log(\hat{y})$。 - 准确率(accuracy)表示分类正确率,如$acc = \frac{\text{正确样本数}}{\text{总样本数}}$。 - 其他指标:学习率、梯度范数、批次大小等。 日志格式示例(基于文本或可视化工具如TensorBoard): ``` Epoch 1/100, Loss: 0.25, Train Acc: 0.85, Val Acc: 0.80 Epoch 2/100, Loss: 0.18, Train Acc: 0.90, Val Acc: 0.82 ... ``` 分析时,需对比训练集和测试集数据。引用[^3]显示,随着训练次数增加,准确率和损失值变化:蓝色线代表训练集,橙色线代表测试集。例如,在迭代到1600个batch后,效果趋于稳定,训练集准确率在98%附近波动,损失值在0.07附近;测试集准确率最高点出现在2600个batch时(89.20%),损失值在400个batch后发散。这有助于发现过拟合(训练集性能好但测试集差)或欠拟合[^3]。 #### 2. **日志分析方法** 日志分析的核心是可视化趋势和统计计算: - **可视化工具**:使用TensorBoard、Matplotlib等绘制曲线,监控loss和accuracy的收敛情况。例如,损失值应单调下降,如果出现震荡或上升,表明学习率过高或数据问题。 - 独立公式示例(损失函数收敛): $$ \lim_{t \to \infty} L_t = L_{\text{min}} $$ 其中$t$为迭代次数,$L_{\text{min}}$为最小损失值。 - **关键指标检查**: - 过拟合检测:如果训练集准确率高(如98%),但测试集低(如85%),需添加正则化或早停(early stopping)。 - 欠拟合检测:损失值下降缓慢,可能需增加模型复杂度或调整学习率。 - 梯度检查:日志中梯度值过大或过小(如梯度爆炸/消失),可调整优化器参数。 - **性能优化**:基于日志,实施代码优化(如减少冗余计算)、数据库优化(高效数据加载)和系统监控(资源使用率),确保训练高效稳定[^1]。 #### 3. **调试方法与错误处理** 当日志显示异常(如准确率突降或损失值发散),需进行调试: - **错误定位**:检查训练脚本中的路径、数据加载和模型初始化。引用[^2]强调,脚本应处理错误并提供清晰调试信息,例如: - 验证数据集路径是否正确,避免因文件缺失导致训练失败。 - 添加详细日志输出,如每个批次的梯度值,便于快速定位问题。 - **调试步骤**: 1. **日志分析**:重现问题,如测试集损失值发散时,检查数据泄露或噪声。 2. **单元测试**:对模型组件(如损失函数)进行独立测试,确保计算正确。例如,验证$L(\theta)$在边界值的行为。 3. **版本控制**:使用Git记录代码变更,对比不同版本的日志,识别引入错误的提交。 4. **交互调试**:在IDE中设置断点,实时监控变量值;或使用异常捕获(如Python的try-except块)输出错误详情。 - **常见问题解决**: - 如果日志显示训练停滞,降低学习率或换用Adam优化器。 - 如果测试集性能差,增加数据增强或dropout层。 引用[^1]提到,结合性能优化和调试方法(如日志分析和代码调试),能显著提升系统稳定性[^1]。 #### 4. **最佳实践与工具推荐** - **工具**:TensorFlow/PyTorch的日志模块、MLflow用于实验跟踪、ELK栈(Elasticsearch, Logstash, Kibana)用于大规模日志分析。 - **流程**: 1. 训练前:设置详细日志级别(如DEBUG模式)。 2. 训练中:实时监控日志仪表盘。 3. 训练后:分析日志报告,优化超参数(如学习率$\eta$)。 - **可靠性注意**:日志应包含时间戳和上下文,避免信息过载;定期备份日志,防止数据丢失。 通过以上方法,您可以有效利用训练日志进行调试和性能调优,提升深度学习模型的泛化能力和效率。实践中,需结合具体框架(如YOLO目标检测)调整策略[^2]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值