【发布时间】:2017-06-04 15:24:17
【问题描述】:
如何在新数据集上微调 TensorFlow 中的预训练模型?在 Caffe 中,我可以简单地重命名最后一层并为随机初始化设置一些参数。张量流中是否有类似的可能?
假设我有一个检查点文件 (deeplab_resnet.ckpt) 和一些设置计算图的代码,我可以在其中修改最后一层,使其具有与新数据集的类相同数量的输出。
然后我尝试像这样开始会话:
sess = tf.Session(config=config)
init = tf.initialize_all_variables()
sess.run(init)
trainable = tf.trainable_variables()
saver = tf.train.Saver(var_list=trainable, max_to_keep=40)
saver.restore(sess, 'ckpt_path/deeplab_resnet.ckpt')
但是,这在调用 saver.restore 函数时给了我一个错误,因为它需要与保存它的图形结构完全相同的图形结构。
我怎样才能只加载除'ckpt_path/deeplab_resnet.ckpt' 文件中的最后一层之外的所有权重?
我还尝试更改 Classification 图层名称,但也没有运气......
【问题讨论】:
-
我不太明白你想要什么。你想修改一个层,即使用它但不同(改变形状等)还是你想使用所有模型但层(使用一个全新的层)。点滴
-
两者(通常在微调中完成)。我用一个旧模型替换最后一层,用一个适合新数据集的新类别数的模型。然后这最后一层需要随机初始化。我猜@Alexey Romanovs 的答案已经是解决方案的一半。唯一缺少的部分是当网络从以前的 caffemodel 导入时层的显式随机初始化,就像
tensorflow-deeplab-resnet中的情况一样 -
@mcExchange,请用完整的解决方案填写下面的答案和/或批准下面的解决方案。
标签: tensorflow