对于图像任务,我使用了deeplab V3结构,但是我做了一个细微的更改,在输入时添加了一个通道。所以CNN的第一层变成了7,7,4,64,而不是7,7,3,64。
我计划做传输学习,所以我希望恢复所有的参数,除了第一层的第四个频道,但这四个频道被一个tf.Variable掌握,所以我不知道如何通过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)在主函数中,我们可以看到恢复的变量是由“恢复”控制的。在这种情况下,“还原”的第一个条目是:
<tf.Variable shape=(7,7,4,64) dtype=float32_ref>但我只希望从另一种模式中恢复前三条通道,即大小(7,7,3,64)。并使用零初始化器初始化最后一个通道。
有什么功能能帮上忙吗?
发布于 2019-09-30 14:47:41
一种可能的快速攻击可能是,而不是创建一个新形状的变量,并尝试将其部分转换过来,只需创建一个缺少的变量(所以是shape=7,7,1,64),然后将它与变量连接起来,并使用它作为卷积内核。
为了使传输学习正常工作,这应该是零输入的,而不是随机变量(因为其他值不对称),或者用与预先训练过的值相比非常小的值初始化(假设新的通道具有相同的值范围),否则后面的层将看不到他们期望的分布。
https://stackoverflow.com/questions/58163964
复制相似问题