在niftynet上实施转移学习

时间:2018-10-29 17:36:52

标签: python tensorflow deep-learning niftynet

我想使用Dense V-Net架构实现迁移学习。在搜寻如何执行此操作时,我发现此功能当前正在使用(How do I implement transfer learning in NiftyNet?)。

尽管从该答案中可以很明显地看出,没有直接的方法可以实现它,但我还是在尝试:

1)创建密集的V-Net

2)从.ckpt文件恢复重量

3)独自实施迁移学习

要执行步骤1,我以为可以使用niftynet.network.dense_vnet模块。因此,我尝试了以下操作:

checkpoint = '/path_to_ckpt/model.ckpt-3000.index'
x = tf.placeholder(dtype=tf.float32, shape=[None,1,144,144,144])
architecture_parameters = dict(
    use_bdo=False,
    use_prior=False,
    use_dense_connections=True,
    use_coords=False)

hyperparameters = dict(
    prior_size=12,
    n_dense_channels=(4, 8, 16),
    n_seg_channels=(12, 24, 24),
    n_input_channels=(24, 24, 24),
    dilation_rates=([1] * 5, [1] * 10, [1] * 10),
    final_kernel=3,
    augmentation_scale=0)
model_instance = DenseVNet(num_classes=9,hyperparameters=hyperparameters,
                             architecture_parameters=architecture_parameters)

model_net = DenseVNet.layer_op(model_instance, x)

但是,出现以下错误:

TypeError: Failed to convert object of type <type 'list'> to Tensor. Contents: [None, 1, 72, 72, 24]. Consider casting elements to a supported type.

所以,问题是:

有什么办法可以实现这一目标?

2 个答案:

答案 0 :(得分:1)

转移学习已添加到NiftyNet。

您可以选择要通过vars_to_restore配置参数还原的变量,以及要通过vars_to_freeze配置参数冻结的变量。

有关更多信息,请参见here

答案 1 :(得分:0)

通过在配置文件的starting_iter部分中将参数[TRAINING]设置为预训练模型数的方式,可以通过从现有模型恢复权重来实现简单的转移学习。在您的示例starting_iter=3000中。

这将从模型中恢复权重,并且新的迭代将从此初始化开始。

这里的模型架构必须完全相同,否则会出现错误。

对于更复杂的迁移学习或更好的调音(仅可以恢复一部分权重),有一个很好的实现here。它可能很快就会与niftynet官方存储库合并,但是您已经可以使用它了。