如何在NiftyNet中实现转移学习?

时间:2018-06-08 21:54:29

标签: python machine-learning multilabel-classification niftynet

我想使用NiftyNet堆栈执行一些传输学习,因为我的标记图像数据集相当小。在TensorFlow中,这是可能的 - 我可以加载各种预先训练的网络并直接使用它们的层。为了微调网络,我可以冻结中间层的训练,只训练最后一层,或者我可以使用中间层的输出作为特征向量来输入另一个分类器。

我如何在NiftyNet中执行此操作?在文档或源代码中唯一提到的“转移学习”是参考模型动物园,但对于我的任务(图像分类),动物园中没有可用的网络。 ResNet架构似乎已经实现并可供使用,但就我所知,它尚未接受任何培训。此外,似乎我可以训练网络的唯一方法是运行net_classify train,使用配置文件中的各种TRAIN配置选项,其中任何一个都没有冻结网络的选项。 niftynet.layer中的各个层似乎也没有选项来使它们能够被训练。

我想我的问题是:

  1. 是否可以通过预先培训的TensorFlow网络移植?
    • 如果我在NiftyNet中手动重新创建图层架构,有没有办法从预先训练好的TF网络导入权重?
  2. 如何访问模型的中间权重和图层? (How can I get access to intermediate activation maps of the pre-trained models in NiftyNet?指的是模型动物园,可以使用net_download获取它们,但不能使用任意模型获取它们。
  3. 顺便说一句,学习率似乎也是一个常数 - 随着时间的推移会改变这种情况,我是否必须运行网络进行一些迭代,更改lr,然后重新开始训练检查点?

1 个答案:

答案 0 :(得分:1)

[编辑]:Here是使用NiftyNet进行迁移学习的文档。

此功能目前正在使用中。有关详细信息,请参见here

预期功能包括:

  • 用于打印所有可训练变量名称的命令(具有可选的正则表达式匹配项)
  • 能够随机初始化变量的子集,该子集由正则表达式名称匹配创建
  • 具有从现有检查点恢复并继续更新变量子集的能力。如果更改了优化方法,请处理方法特定的变量(例如动量)
  • 能够从现有检查点恢复并冻结其余变量的训练权重
  • 训练后保存所有可训练变量
  • 添加用于微调的配置参数,变量名regex, 单元测试
  • 演示/教程
  • 预处理兼容性问题检查点
  • 使用批处理规范和退出层进行交易(编辑网络以删除批处理规范变量)