【问题标题】:How do I implement transfer learning in NiftyNet?如何在 NiftyNet 中实现迁移学习?
【发布时间】:2018-11-19 00:00:14
【问题描述】:

我想使用 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,然后从最后一个检查点重新开始训练?

【问题讨论】:

标签: python machine-learning multilabel-classification niftynet


【解决方案1】:

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

目前正在开发此功能。详情请参阅here

预期功能包括:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-28
    • 1970-01-01
    • 2017-09-14
    • 2020-05-13
    • 2018-10-04
    • 2019-06-28
    • 1970-01-01
    相关资源
    最近更新 更多