我正在使用deeplab V3结构执行图像任务,但是我做了一点改动,在输入端添加了一个通道。这样第一CNN层将变为[7,7,4,64],而不是[7,7,3,64]。
我打算进行迁移学习,所以我希望恢复除第一CNN层的第四通道外的所有参数,但是这四个通道是由一个tf掌握的。变量,所以我不知道如何恢复它们通过tf.train.Saver。 (tf.train.Saver可以控制应恢复哪个tf.Variable,但我不能控制某些tf.Variable的值)
有什么主意吗?
一些相关的代码如下所示:
def load(saver, sess, ckpt_path):
saver.restore(sess, ckpt_path)
# 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)。然后使用零初始化程序初始化最后一个通道。
任何功能都可以帮助解决此问题吗?
答案 0 :(得分:0)
一种可能的快速破解方法,不是创建具有新形状的变量并尝试对其进行转换,而只是创建缺少部分的变量(所以shape = [7,7,1,64] ),然后将其与您的变量连接起来,并将其用作卷积内核。
为使迁移学习正常工作,应将其初始化为零而不是随机变量(这应该很好,因为其他值会破坏对称性),或者使用与预训练值相比很小的值进行初始化(假设新渠道具有相同的值范围),否则后面的图层将看不到他们期望的分布。