TensorFlow获取指定Tensor值与排查NAN问题详解
本文介绍在TensorFlow训练过程中获取指定Tensor值的方法,包括通过图节点名称提取参数。针对Conv1和BN1层出现NAN导致后续层输出为0且无法更新的问题,分析数据中NAN的影响,并提供获取Tensor名称及值的代码示例,帮助开发者排查模型训练异常。
TensorFlow获取指定Tensor值的方法
以下直接展示相关代码实现。
代码示例:Tensor切片与取值
In [1]: import os
In [2]: os.environ["CUDA_VISIBLE_DEVICES"] = "0"
In [3]: import tensorflow as tf
In [4]:sess =tf.Session()
In [5]: input = tf.constant([[[1,2,3],[4,5,6],[7,8,9]],[[10,11,12],[13,14,15],[1
...: 6,17,18]]])
In [6]: input.get_shape()
Out[6]: TensorShape([Dimension(2), Dimension(3), Dimension(3)])
In [7]: input_2 = input[:,:,2]
In [8]: print(sess.run(input_2))
[[ 3 6 9]
[12 15 18]]
In [9]: input_2 = input[:,:,0:2]
In [10]: print(sess.run(input_2))
[[[ 1 2]
[ 4 5]
[ 7 8]]
[[10 11]
[13 14]
[16 17]]]
In [11]: input = tf.constant([[[[1,2,3],[4,5,6],[7,8,9]],[[10,11,12],[13,14,15],
...: [16,17,18]]]])
In [12]: input.get_shape()
Out[12]: TensorShape([Dimension(1), Dimension(2), Dimension(3), Dimension(3)])
In [13]: input_2 = input[:,:,2]
In [14]: print(sess.run(input_2))
[[[ 7 8 9]
[16 17 18]]]
In [15]: input_2 = input[:,:,:,2]
In [16]: print(sess.run(input_2))
[[[ 3 6 9]
[12 15 18]]]
训练中出现NAN问题的排查
补充说明:在TensorFlow模型训练期间,若需获取特定Tensor的值,且仅发现conv1与bn1层存在NAN(Not a Number)异常。
1. 在模型训练过程中,获取特定参数Tensor值的方法:
首先获取图中所有Tensor的名称列表:
[tensor.name for tensor in tf.get_default_graph().as_graph_def().node]
根据已知的Tensor名称获取对应的Tensor对象:
bn_gamma = sess.graph.get_tensor_by_name('bn1_audio/batch_normalization/beta:0')
随后通过sess.run()执行会话并打印该Tensor的值。

NAN问题导致后续层不更新的原理
2. 现象描述:仅conv1的filter、bias以及bn1的gamma值为NAN。
原因分析:由于训练数据中本身包含NAN值。
bn1层之后的max pooling层输出全为0(因为bn1输出中包含0),这导致后续层的参数和输出看似正常,但实际上这些参数不会得到更新。
以上关于TensorFlow获取指定Tensor值及处理相关异常的操作方式即为全部内容,供读者参考,欢迎支持。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









