【问题标题】:Incremental training using TensorFlow使用 TensorFlow 进行增量训练
【发布时间】:2016-10-01 07:28:52
【问题描述】:

我想训练一个模型来分类 90K 个标签,所以我使用了所谓的增量训练。

我最初训练模型只对 1K 个标签进行分类,然后添加另外 1K 个标签并将最终 FC 层的输出维度扩展到 2K,并训练更多的 epoch。之后我再添加 1K 个标签,依此类推...

请注意,它不是微调,其中最后一个 FC 之前的所有参数都是固定的,因此我可以缓存输出特征。就我而言,我需要更新每个阶段的所有变量。

我设计的解决方案是:

  1. 训练 1K 个标签。
  2. 保存模型。
  3. 修改图,让最后一个FC层输出2K维度。
  4. 初始化所有变量
  5. 加载上一个检查点,这将覆盖所有参数,但最后一层的权重。
  6. 再次训练并重复

所以这里的重点是实现部分还原检查点。

在 TensorFlow 中,我使用这样的代码来加载检查点:

saver.restore(sess, "model.ckpt")

但是,当形状不匹配时,它会失败。

任何人都可以提供帮助,无论是如何部分恢复/初始化变量,还是如何以其他方式实施增量训练?

【问题讨论】:

    标签: tensorflow


    【解决方案1】:

    目前这并不容易做到。我们正在积极添加新的 API 以使其更容易。

    同时,如果你真的下定决心,:),你可以在改变FC层的大小时尝试以下方法:

    • 创建阅读器: reader = tf.train.NewCheckpointReader(your_checkpoint_file)
    • 加载检查点文件中的所有变量: cur_vars = reader.get_variable_to_shape_map().keys()
    • 删除原来的FC层: cur_vars_without_fc = cur_vars - your_fc_layer_var_name
    • 使用以下变量创建保护程序: saver = tf.Saver(cur_vars_without_fc) saver.restore(sess, your_checkpoint_file)
    • 初始化新 FC 层的变量: sess.run([your_fc_layer_var.initializer])

    希望有帮助!

    雪利酒

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-06
      • 1970-01-01
      • 1970-01-01
      • 2020-02-28
      • 1970-01-01
      • 2018-06-30
      • 1970-01-01
      相关资源
      最近更新 更多