是否可以在Tensorflow中恢复任何层的部分值?

时间:2019-09-30 08:18:00

标签: tensorflow

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

我打算进行迁移学习,所以我希望恢复除第一CNN层的第四通道外的所有参数,但是这四个通道是由一个tf掌握的。变量,所以我不知道如何恢复它们通过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)

在主函数中,我们可以看到恢复的变量由“ restore”控制。在这种情况下,“还原”的第一项是:

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

但是我唯一希望恢复的是另一个模型的前三个通道,其大小为(7,7,3,64)。然后使用零初始化程序初始化最后一个通道。

任何功能都可以帮助解决此问题吗?

1 个答案:

答案 0 :(得分:0)

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

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