使用TensorFlow的增量训练
我想训练一个模型来分类90K标签,所以我使用了所谓的增量训练 我首先训练模型只对1K标签进行分类,然后再添加1K标签,并将最终FC层的输出维度扩展到2K,然后训练更多的历元。之后,我又添加了1K标签,以此类推 请注意,它不是微调,即最后一个FC之前的所有参数都是固定的,因此我可以缓存输出特性。在我的例子中,我需要更新每个阶段中的所有变量 我设计的解决方案是:使用TensorFlow的增量训练,tensorflow,Tensorflow,我想训练一个模型来分类90K标签,所以我使用了所谓的增量训练 我首先训练模型只对1K标签进行分类,然后再添加1K标签,并将最终FC层的输出维度扩展到2K,然后训练更多的历元。之后,我又添加了1K标签,以此类推 请注意,它不是微调,即最后一个FC之前的所有参数都是固定的,因此我可以缓存输出特性。在我的例子中,我需要更新每个阶段中的所有变量 我设计的解决方案是: 培训1K标签 保存模型 修改图形,使最后一个FC层输出2K维度 初始化所有变量 加载上一个检查点,该检查点将覆盖所有参数,但最后一层的权重
saver.restore(sess, "model.ckpt")
但是,当存在形状不匹配时,它将失败
在如何部分恢复/初始化变量,或者如何以另一种方式实施增量培训方面,有人能提供帮助吗?这目前并不容易做到。我们正在积极添加新的API以使其更容易 同时,如果您确实确定,:),您可以在更改FC层的大小时尝试以下操作:
- 创建一个读卡器: reader=tf.train.NewCheckpointReader(您的检查点文件)
- 加载检查点文件中的所有变量: cur_vars=reader.get_variable_to_shape_map().keys()
- 删除原始FC层: cur\u vars\u without\u fc=cur\u vars-您的\u fc\u图层\u var\u名称
- 使用以下变量创建一个保护程序: saver=tf.saver(不带fc的cur\u vars\u) saver.restore(sess,您的检查点文件)
- 初始化新FC层的变量: sess.run([您的\u fc\u层\u变量初始值设定项])