sess.run(LAYER)返回值是什么?全连接层调用返回张量相关疑问
问题解答
首先直接给结论:当你调用sess.run(fc_3)(或者fc_1、fc_2)时,返回的是对应全连接层的输出张量的具体数值,既不是权重,也不是梯度。
详细拆解:
- 你用
tf.contrib.layers.fully_connected创建的fc_1、fc_2、fc_3本质上是TensorFlow计算图中的输出节点:它们代表的是输入经过该层的计算逻辑(输入矩阵×权重矩阵 + 偏置,再经过默认的ReLU激活函数)后的结果。 - 当执行
sess.run(...)时,TensorFlow会沿着计算图追踪所有依赖的节点,先计算fc_input的数值,再依次计算fc_1(需要用到它的权重、偏置变量)、fc_2、fc_3的最终结果,最后返回给你的就是fc_3对应的具体数值——也就是整个三层全连接网络的最终输出。
关于权重和梯度的获取:
- 如果想获取权重/偏置的数值,你需要直接访问层的变量。比如
fc_1的权重可以通过fc_1.weights[0]获取,偏置是fc_1.weights[1],然后调用sess.run(fc_1.weights[0])才能得到权重的具体值。 - 梯度是在反向传播过程中计算的:你需要先定义损失函数,然后用
tf.gradients(loss, fc_1.weights)这样的API得到梯度张量,再通过sess.run才能拿到梯度的数值。
所有Layer调用sess.run都返回这类张量吗?
大部分常规的TensorFlow层(比如全连接、卷积、池化层),当你调用层创建的输出节点时,sess.run返回的都是该层的输出结果。不过有几个例外情况需要注意:
- 部分层可能有多个输出(比如自定义的多输出层,或者像
tf.nn.moments这类返回均值和方差的操作),此时sess.run会返回对应数量的数值结果。 - 如果你直接获取的是层的变量(比如
layer.weights),那sess.run返回的就是变量的具体值(比如权重、偏置),这和层的输出是完全不同的概念。
内容的提问来源于stack exchange,提问作者NorwegianClassic
相关产品推荐
相关产品推荐

