【问题标题】:Concatenation of a trainable and an untrainable variable in TensorFlowTensorFlow 中可训练变量和不可训练变量的连接
【发布时间】:2018-04-26 19:31:39
【问题描述】:

假设变量 A 的形状为 [123, 64],变量 B 的形状为 [123, 32],那么 A 和 B 的拼接 tf.concat([A, B], axis=1) 可以创建变量 C形状为 [123, 96]

假设 A 被创建为 trainable,B 被创建为 untrainable。 C 是 A 和 B 沿轴 1 的串联。

在优化loss的时候这样创建的变量C怎么样?

  1. C 是可训练的
  2. C 无法训练
  3. C 的前 64 列是可训练的,而 C 的后 32 列是不可训练的。

【问题讨论】:

    标签: python tensorflow


    【解决方案1】:

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

    连接操作返回一个连接操作,因此不是变量(因此不可训练)。因此,您必须将结果包装到 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 本身。

    【讨论】:

    • 只是一个简短的说明。我认为强调“(它会因为你创建一个新变量)”部分非常重要。 C 本身永远不会是可训练的变量,它的任何“部分”都不会是可训练的,它只是一个中间张量。唯一可训练的变量是 A 本身。
    • 这是一个很好的注释。我可以将其添加到答案中吗?
    • 当然,这会帮助每个在这里磕磕绊绊的人。
    • 复制粘贴您的评论。谢谢
    【解决方案2】:

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

    y = A*x + b 
    

    TensorFlow 并不真正关心您让A 流入什么样的操作、连接或其他任何操作。只要为操作定义了梯度,TensorFlow 就会执行自动微分并计算底层可训练变量的梯度,这只是A 本身。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-30
      • 2017-11-30
      • 2016-09-16
      • 1970-01-01
      • 2020-07-16
      • 2022-01-25
      • 2019-12-07
      • 1970-01-01
      相关资源
      最近更新 更多