TensorFlow获取指定Tensor值与排查NAN问题详解

Jasper
Jasper
发布时间:2026-10-14 | 5人浏览过
原创

本文介绍在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值及处理相关异常的操作方式即为全部内容,供读者参考,欢迎支持。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表