nnUnet: 使用自己(自定义)网络训练

这篇具有很好参考价值的文章主要介绍了nnUnet: 使用自己(自定义)网络训练。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、简介

nnUnet是有监督的医学图像分割绕不开的话题(虽然看到有些文章对比实验没加nnUnet?可能比不过? ),其卓越的性能和简易的方法,为相关研究者提供了一项强有力的工具。然而,由于高度封装性,在原先代码中嵌入自定义网络进行训练,并不是十分方便(至少对我来说 )。本文旨在分享一点在使用nnUnet训练自定义网络过程中的一点经验,可能存在纰漏(???),欢迎在讨论区交流!

二、准备工作

2.1 硬件需求

nnUnet的建议环境是Linux,若使用Windows,需修改路径相关代码(斜杠和反斜杠的替换),很麻烦(不推荐)。博主是在Ubuntu环境中使用Pycharm进行nnUnet的学习。

2.2 调试环境

nnUnet官方推荐的使用方法是在命令行,但这不方便初学者学习。因为只用过Pycharm调试代码(菜!),所以为了满足自己的需求(?),以便于用Pycharm的傻瓜式调试按钮,修改了部分代码: nnunet/paths.pynnunet/run/run_training.py

2.2.1 路径

位于***nnunet/paths.py***文件中,将三个变量路径修改为自己的路径。custom_是博主自己定义的文件,大家可以随意实现。

from custom_ import custom_config
base = custom_config['base']
preprocessing_output_dir = custom_config['preprocessing_output_dir']
network_training_output_dir_base = custom_config['network_training_output_dir_base']

2.2.2 parser

位于***nnunet/run/run_training.py***文件中,这里nnUnet训练代码的入口(!!!)。由于不是命令行调用方式,需要将parser进行修改,添加 “-” 并设置 default 值。

    parser = argparse.ArgumentParser()
    parser.add_argument("-network", default='2d')
    parser.add_argument("-network_trainer", default='nnUNetTrainerV2')
    parser.add_argument("-task", default='666', help="can be task name or task id")
    parser.add_argument("-fold", default='0', help='0, 1, ..., 5 or \'all\'')

三、训练

3.1 构建网络

nnUnet要求网络继承 SegmentationNetwork 类,这里提供一种可实现的方法,用的时候将 self.model 修改为 自定义网络 即可。

from nnunet.network_architecture.neural_network import SegmentationNetwork


class custom_net(SegmentationNetwork):

    def __init__(self, num_classes):
        super(custom_net, self).__init__()
        self.params = {'content': None}
        self.conv_op = nn.Conv2d
        self.do_ds = True
        self.num_classes = num_classes
        
		######## self.model 设置自定义网络 by Sleeep ########
        self.model = None
        ######## self.model 设置自定义网络 by Sleeep ########
        
        self.name = self.model.name

    def forward(self, x):

        if self.do_ds:
            return [self.model(x), ]
        else:
            return self.model(x)


def create_model():

    return custom_net(num_classes=2)

3.2 修改配置

构建好网络后,还需要修改一些超参数才能完成训练,修改内容位于 /nnunet/training/network_training/nnUNetTrainerV2.py 文件中。修改nnUNetTrainerV2类中的两个函数 initializeinitialize_network。为了减少训练代数,还可修改函数***init***

3.2.1 initialize

def initialize(self, training=True, force_load_plans=False):
        """
        - replaced get_default_augmentation with get_moreDA_augmentation
        - enforce to only run this code once
        - loss function wrapper for deep supervision
        :param training:
        :param force_load_plans:
        :return:
        """
        if not self.was_initialized:
            maybe_mkdir_p(self.output_folder)

            if force_load_plans or (self.plans is None):
                self.load_plans_file()
            # load plan informantion !!!   modify batch_size or patch_size after this
            self.process_plans(self.plans)
            ############## modify para by Sleeep ##############
            self.patch_size = np.array(custom_config['patch_size']).astype(int)
            self.batch_size = custom_config['batch_size']
            self.net_num_pool_op_kernel_sizes = [[2, 2]]
            ############## modify para by Sleeep ##############

self.process_plans(self.plans): 官方函数,会载入预处理阶段所生成的各种参数
self.patch_size: 官方预处理后的 图像尺寸不一定满足自定义网络的需要,可在这里修改。举个例子,在预处理阶段,nnUnet自动确定的patch_size为[53, 64](对于2d网络),然而我的网络需要满足输入尺寸均为 32 的整数倍,自动生成的patch_size并不能满足,所以这里可修改为[64, 64]。self.patch_size会在后续构建 数据增强方法 的函数中使用。
self.batch_size: 根据自己的硬件配置修改
self.net_num_pool_op_kernel_sizes: 这个参数非常重要!其作用是 确定 深监督的层数 和 不同层数的尺寸大小。这里默认自定义网络不使用深监督,所以设置 为 只有一个列表元素即可,里面的值随意(可能吧?对于不是使用深监督的情况

3.2.2 initialize_network

 def initialize_network(self):
        """
        - momentum 0.99
        - SGD instead of Adam
        - self.lr_scheduler = None because we do poly_lr
        - deep supervision = True
        - i am sure I forgot something here
        Known issue: forgot to set neg_slope=0 in InitWeights_He; should not make a difference though
        :return:
        """
        # if self.threeD:
        #     conv_op = nn.Conv3d
        #     dropout_op = nn.Dropout3d
        #     norm_op = nn.InstanceNorm3d
        #
        # else:
        #     conv_op = nn.Conv2d
        #     dropout_op = nn.Dropout2d
        #     norm_op = nn.InstanceNorm2d
        #
        # norm_op_kwargs = {'eps': 1e-5, 'affine': True}
        # dropout_op_kwargs = {'p': 0, 'inplace': True}
        # net_nonlin = nn.LeakyReLU
        # net_nonlin_kwargs = {'negative_slope': 1e-2, 'inplace': True}
        # self.network = Generic_UNet(self.num_input_channels, self.base_num_features, self.num_classes,
        #                             len(self.net_num_pool_op_kernel_sizes),
        #                             self.conv_per_stage, 2, conv_op, norm_op, norm_op_kwargs, dropout_op,
        #                             dropout_op_kwargs,
        #                             net_nonlin, net_nonlin_kwargs, True, False, lambda x: x, InitWeights_He(1e-2),
        #                             self.net_num_pool_op_kernel_sizes, self.net_conv_kernel_sizes, False, True, True)
        ############## add custom model by Sleeep ##############
        self.network = create_model()
        ############## add custom model by Sleeep ##############
        if torch.cuda.is_available():
            self.network.cuda()
        self.network.inference_apply_nonlin = softmax_helper

将原先nnunet网络注释,加入自己的网络。

3.2.3 init

    def __init__(self, plans_file, fold, output_folder=None, dataset_directory=None, batch_dice=True, stage=None,
                 unpack_data=True, deterministic=True, fp16=False):
        super().__init__(plans_file, fold, output_folder, dataset_directory, batch_dice, stage, unpack_data,
                         deterministic, fp16)
        ##### by Sleeep ####
        self.max_num_epochs = custom_config['epoch']
        self.initial_lr = custom_config['lr']
        ##### by Sleeep ####
        
        self.deep_supervision_scales = None
        self.ds_loss_weights = None

        self.pin_memory = True

默认的epoch是1000,有点久,改小点。默认lr是0.01文章来源地址https://www.toymoban.com/news/detail-466895.html

四、注意事项

  1. 点赞 收藏 评论 再走
  2. 先过一遍nnunet论文和官方github中的说明。官方提供的一个example ,其中使用的数据集相对来说较小,可先在该数据集上调试成功后,再使用自定义网络

参考资料

  1. nnUnet

到了这里,关于nnUnet: 使用自己(自定义)网络训练的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 如何使用torch.nn.utils.prune稀疏神经网络,以及如何扩展它以实现自己的自定义剪裁技术

    最新的深度学习技术依赖于难以部署的过度参数化模型。 相反,已知生物神经网络使用有效的稀疏连通性。 为了减少内存,电池和硬件消耗,同时又不牺牲精度,在设备上部署轻量级模型并通过私有设备上计算来确保私密性,确定通过减少模型中的参数数量来压缩模型的最

    2024年02月12日
    浏览(44)
  • 在Windows下用Pycharm实现nnUnet网络

    目录 1 写在前面 2 代码下载 2.1 Windows下: 2.2 Linux下: 3 虚拟环境 3.1 代码放置 3.2 创建虚拟环境 创建虚拟环境:  激活环境: 添加镜像源: 查看cuda,输入:  安装torch: 配置pycharm的虚拟环境:  4 安装nnUnet的相关配置 4.1 requirements 4.2 安装隐藏层  5 数据集准备 5.1 创建文件

    2024年02月09日
    浏览(56)
  • 精华整理几十个Python数据科学、机器学习、深度学习、神经网络、人工智能方面的核心库以及详细使用实战案例,轻松几行代码训练自己的专有人工智能模型

    精华整理几十个Python数据科学、机器学习、深度学习、神经网络、人工智能方面的核心库以及详细使用实战案例,轻松几行代码训练自己的专有人工智能模型。 机器学习 人工智能的核心,是使计算机具有智能的根本途径。机器学习专注于算法,允许机器学习而不需要编程,

    2024年01月25日
    浏览(78)
  • 自定义的卷积神经网络模型CNN,对图片进行分类并使用图片进行测试模型-适合入门,从模型到训练再到测试,开源项目

    自定义的卷积神经网络模型CNN,对图片进行分类并使用图片进行测试模型-适合入门,从模型到训练再到测试:开源项目 开源项目完整代码及基础教程: 资料获取,关注公众号【一起来学习哟】获取 CNN模型: 1.导入必要的库和模块: torch:PyTorch深度学习框架。 torchvision:P

    2024年02月06日
    浏览(47)
  • 使用MMDetection训练自己的数据集

    本文主要阐述如何使用 mmdetection 训练自己的数据,包括配置文件的修改,训练时的数据增强,加载预训练权重以及绘制损失函数图等。这里承接上一篇文章,默认已经准备好了 COCO 格式数据集且已安装 mmdetection ,环境也已经配置完成。 这里说明一下,因为 mmdetection 更新至

    2024年02月06日
    浏览(60)
  • 使用SwinUnet训练自己的数据集

    参考博文: https://blog.csdn.net/qq_37652891/article/details/123932772 遥感图像多类别语义分割,总共分为7类(包括背景) image: label_rgb label(这里并不是全黑,其中的类别取值为 0,1,2,3,4,5,6 ),此后的训练使用的也是这样的数据 数据地址 百度云: https://pan.baidu.com/s/1zZHnZfBgVWxs6T

    2024年02月04日
    浏览(51)
  • 使用Yolov5训练自己的模型

    本文主要介绍如何运用开源Yolov5模型,结合自己的数据,训练其他目标检测模型。 基础准备工作: anaconda 适用Yolov5的虚拟环境 git上下载Yolov5并调通测试代码 https://github.com/ultralytics/yolov5 https://github.com/ultralytics/yolov5 本次用的环境: python==3.7 pytorch==1.7.1 torchvision==0.8.2 torchaud

    2024年02月05日
    浏览(56)
  • 使用pyskl的stgcn++训练自己的数据集

    https://github.com/kennymckormick/pyskl 包含多种动作分类的模型,感谢大佬 训练过程主要参考项目中的 examples/extract_diving48_skeleton/diving48_example.ipynb 但是我一开始不知道这个文件,从网上查不到太多的资料,走了不少弯路,这里就把我训练的过程分享一下。 这里使用的是Weizmann数据

    2024年02月03日
    浏览(35)
  • 使用yolox训练自己的数据集并测试

    ​​​​​​https://github.com/bubbliiiing/yolox-pytorch 百度网盘链接给出自己完整的模型(包括数据集以及权重文件): 链接:https://pan.baidu.com/s/1JNjB42u9eGNhRjr1SfD_Tw  提取码:otq0 1.选择配置好的深度学习环境 2.修改train.py里面的classes_path,将自己想要分类的类别填充进去  3.修改权

    2024年02月09日
    浏览(34)
  • SwinIR Transformer训练教程(使用自己的数据集)

    SwinIR Transformer图像超分辨率重建训练教程 文章:https://arxiv.org/abs/2108.

    2024年02月13日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包