代码之家  ›  专栏  ›  技术社区  ›  Tom

TensorFlow中可训练变量和不可训练变量的串联

  •  1
  • Tom  · 技术社区  · 8 年前

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

    假设A创建为 可培训 B被创建为 无法训练 .C是A和B沿轴1的串联。

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

    1. C可培训
    2. C无法训练
    3. 确切地说,C的前64列是可训练的,而C的最后32列是不可训练的。
    2 回复  |  直到 8 年前
        1
  •  4
  •   nessuno    8 年前

    您可以自己检查 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本身。

        2
  •  1
  •   Alexander Harnisch    8 年前

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

    y = A*x + b 
    

    TensorFlow并不真正关心你的手术方式 A. 流入、串联或其他任何情况。只要为操作定义了梯度,TensorFlow将执行自动微分并计算基础可训练变量的梯度,该梯度仅为 A. 它本身

    推荐文章