TensorFlow中可训练变量和不可变量变量的连接

时间:2018-04-23 07:14:52

标签: python tensorflow

假设变量A具有形状[123,64],变量B具有形状[123,32],则A和B的串联tf.concat([A,B],轴= 1)可以创建变量C形状[123,96]

假设A创建为可训练,B创建为无法解决。 C是沿轴1的A和B的串联。

如何在优化损失时以这种方式创建变量C?

  1. C是可训练的
  2. C无法解决
  3. C的前64列完全可以训练,C的最后32列是无法控制的。

2 个答案:

答案 0 :(得分:2)

您可以自行检查C变量是否可以训练,但首先您必须创建变量C

连接操作返回concat,operation,因此不是变量(因此不可训练)。因此,您必须将结果包装到tf.Variable中以查看它是否可训练(并且因为您创建了一个新变量)。

import tensorflow as tf
a = tf.get_variable("a", (123,64))
b = tf.get_variable("b", (123, 32), trainable=False)
c = tf.concat((a,b), axis=1)
# c is an operation, hence it's not trainable
d = tf.Variable(c)
# d is a Variable created with the content of d, hence trainable
trainable = d.name in [x.name for x in tf.trainable_variables()]

快速说明一下。我认为强调“(并且它会因为你创建一个新变量)”部分非常重要。 C本身永远不会是一个可训练的变量,它的任何“部分”也不会是可训练的,它只是一个中间张量。唯一可训练的变量是A本身。

答案 1 :(得分:1)

C本身不会成为变量。可训练变量仍然只有A。所以答案是你的第三种选择,但不是真的,因为C只是一个中间张量。就像你做了像

这样的事情
y = A*x + b 

TensorFlow并不关心你让A进入什么样的操作,连接或者什么。只要为操作定义了梯度,TensorFlow就会执行自动微分并计算基础可训练变量的梯度,该变量本身只有A