假设变量A具有形状[123,64],变量B具有形状[123,32],则A和B的串联tf.concat([A,B],轴= 1)可以创建变量C形状[123,96]
假设A创建为可训练,B创建为无法解决。 C是沿轴1的A和B的串联。
如何在优化损失时以这种方式创建变量C?
答案 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
。