【问题标题】:Change initializer of Variable in Tensorflow在 Tensorflow 中更改变量的初始化程序
【发布时间】:2016-10-25 19:54:30
【问题描述】:

我有一个预定义的代码来创建一个 Tensorflow 图。变量包含在变量范围内,每个变量都有一个预定义的初始化程序。 有没有办法改变变量的初始化器?

示例: 第一张图定义

with tf.variable_scope('conv1')
    w = tf.get_variable('weights')

稍后我想修改变量并将初始化程序更改为 Xavier:

 with tf.variable_scope('conv1')
     tf.get_variable_scope().reuse_variable()
     w = tf.get_variable('weights',initializer=tf.contrib.layers.xavier_initializer(uniform=False))

但是,当我重用一个变量时,初始化程序不会改变。 稍后当我做initialize_all_variables() 时,我得到默认值而不是 Xavier 如何更改变量的初始化程序? 谢谢

【问题讨论】:

  • 因为你想共享/重用变量,所以只有一个变量,它也应该有一个初始化器,并且在这种情况下更改初始化器在概念上似乎没有意义;可能这就是 Tensorflow 不允许您更改它的原因。您可以简单地将初始化程序添加到 tf.get_variable('weights') 或 tf.variable_scope('conv1') 的第一次出现吗?

标签: python tensorflow


【解决方案1】:

问题是在设置重用时不能更改初始化(初始化是在第一个块期间设置的)。

所以,只需在第一个变量范围调用期间使用 xavier 初始化来定义它。所以第一次调用是,然后所有变量的初始化都是正确的:

with tf.variable_scope(name) as scope:
    kernel = tf.get_variable("W",
                             shape=kernel_shape, initializer=tf.contrib.layers.xavier_initializer_conv2d())
    # you could also just define your network layer 'now' using this kernel
    # ....
    # Which would need give you a model (rather just weights)

如果您需要重新使用这组权重,第二次调用可以获得它的副本。

with tf.variable_scope(name, reuse=True) as scope:
    kernel = tf.get_variable("W")
    # you can now reuse the xavier initialized variable
    # ....

【讨论】:

  • 我遇到了与@aarbelle 相同的问题,只是计算图已经在 TFHub 模块中定义(因此我最初无法使用自定义初始化程序定义它)。在会话上下文中运行全局初始化操作之前,真的不可能更改初始化程序吗?
猜你喜欢
  • 2017-06-16
  • 2019-01-23
  • 2016-12-21
  • 2017-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-30
相关资源
最近更新 更多