【问题标题】:Is it possible to recover parts of values of any layer in Tensorflow?是否可以在 TensorFlow 中恢复任何层的部分值?
【发布时间】:2019-10-01 14:43:14
【问题描述】:

我正在为图像任务使用 deeplab V3 结构,但我做了一点改动,在输入端添加了一个通道。这样第一个 CNN 层就变成了 [7,7,4,6​​4] 而不是 [7,7,3,64]。

我打算做迁移学习,所以我希望恢复除了第一个CNN层的第四个通道之外的所有参数,但是这四个通道由一个tf.Variable掌握,所以我不知道如何恢复它们通过 tf.train.Saver。 (tf.train.Saver 可以控制应该恢复哪个 tf.Variable 但我认为不能控制任何 tf.Variable 的某些值)

有什么想法吗?


部分相关代码如下:

  1. 加载函数
def load(saver, sess, ckpt_path):
    saver.restore(sess, ckpt_path)
  1. 主要功能的一部分
# All variables need to be restored
restore = [v for v in tf.global_variables()]

# Set up tf session and initialize variables
config = tf.ConfigProto()
config.gpu_options.allow_growth = True
sess = tf.Session(config = config)
init = tf.global_variables_initializer()

sess.run(init)

# Load Variables
loader = tf.train.Saver(var_list = restore)
load(loader, sess, args.restore_from)

在 main 函数中,我们可以看到恢复的变量是由 'restore' 控制的。在这种情况下,'restore' 的第一个条目是:

<tf.Variable shape=(7,7,4,64) dtype=float32_ref>

但我只希望从另一个模型中恢复前三个通道,它的大小为 (7,7,3,64)。并用零初始化器初始化最后一个通道。

任何功能都可以帮助解决这个问题?

【问题讨论】:

  • 请输入您的代码以便更好地解释您的情况,以便我们为您提供帮助
  • 感谢您的回复。我已经放了一些代码。如果不够详细,请告诉我。

标签: tensorflow


【解决方案1】:

一个可能的快速破解可能是,而不是创建一个具有新形状的变量并尝试转换它的一部分,而是创建一个缺少部分的变量(所以 shape=[7,7,1,64] ) 并将其与您的变量连接起来,并将其用作卷积核。

为了使迁移学习正常工作,这应该是零初始化而不是随机变量(这应该没问题,因为其他值破坏了对称性),或者使用与预训练的值相比非常小的值进行初始化(假设新通道具有相同的值范围),否则后面的层将看不到他们期望的分布。

【讨论】:

  • 很好的回复。谢谢!
猜你喜欢
  • 1970-01-01
  • 2020-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-13
  • 2016-03-16
相关资源
最近更新 更多