replicate_model_fn现在已被弃用,但是项目中的代码还是用到了这个函数
目前的项目需要用import_meta_graph的方式进行建图,然后finetune
问题出现了,在restore的时候会产生错误
Key tower_1/ssd1200/additional_layers/conv10/conv10_1/bias not found in checkpoint
这是因为replicate_model_fn会对每一个GPU新建一套和原来一模一样的图(调用model_fn的建图代码),如何放在name_scope为tower_?下,但是这些不同的tower会共享weights,因为他们是在variable_scope的reuse=tf.AUTO_REUSE下新建的,所以名字一样的会reuse:可以看到在pbtxt中input为"ssd1200/conv1/conv1_1/kernel/read",变量共享
node {
name: "tower_1/ssd1200/conv1/conv1_1/Conv2D"
op: "Conv2D"
input: "split_inputs/split:1"
input: "ssd1200/conv1/conv1_1/kernel/read"
device: "/device:GPU:1"
attr {
key: "T"
value {
type: DT_FLOAT
}
}
但是当用import_meta_graph替换掉代码建图后,reuse始终是false,也就是不会共享变量,所以是完全复制了一个计算图,所以新建的图的variable在checkpoint中是找不到的:改用import_meta_graph后,再用replicate_model_fn后,新建的图的input并未共享,而是一个新的,所以在restore的时候肯定找不到
node {
name: "tower_1/ssd1200/conv1/conv1_1/Conv2D"
op: "Conv2D"
input: "split_inputs/split:1"
input: "tower_1/ssd1200/conv1/conv1_1/kernel/read"
device: "/device:GPU:1"
attr {
key: "T"
value {
type: DT_FLOAT
}
}