MONAI初上手——模型构建

引言

本篇文章主要内容为对应Pytorch中的示例代码编写MONAI代码以实现相同目的。所以本文概念性知识不再赘述,主要为代码复现。

相关链接:Pytorch初上手------网络搭建

相关知识简述

因为MONAI是基于Pytorch的,所以可以直接用torch.nn.Module作为父类进行继承。MONAI封装了很多模型层和网络模型,不过鉴于我们要做的是复现Pytorch的自定义网络,所以只用其中的模型层即可。自定义网络的步骤与Pytorch一摸一样(毕竟就是Pytorch框架),实现__init__和forward两个方法即可,接下来进行模型搭建。

模型搭建

导入所需的包,模型层上为卷积,上采样,最大池化,激活函数

python 复制代码
import torch
import torch.nn as nn
from monai.networks.blocks import Convolution, UpSample

网络定义与搭建

python 复制代码
class MONAIStyleSegNet(nn.Module):
    """使用 MONAI 组件的分割网络"""
    def __init__(self, in_channels=3, out_channels=1):
        super().__init__()
        
        # 编码器(使用 MONAI 的 Convolution 块)
        self.enc1 = Convolution(
            spatial_dims=2,
            in_channels=in_channels, # 输入通道
            out_channels=64, #输出通道
            kernel_size=3, #卷积核宽度
            strides=1,  #步长
            padding=1, #padding
            act='RELU', #激活函数
            norm=None,
        )
        self.pool1 = nn.MaxPool2d(2) #最大池化
        
        self.enc2 = Convolution(
            spatial_dims=2,
            in_channels=64,
            out_channels=128,
            kernel_size=3,
            strides=1,  # ← 改为 strides
            padding=1,
            act='RELU',
            norm=None,
        )
        self.pool2 = nn.MaxPool2d(2)
        
        self.enc3 = Convolution(
            spatial_dims=2,
            in_channels=128,
            out_channels=256,
            kernel_size=3,
            strides=1,  # ← 改为 strides
            padding=1,
            act='RELU',
            norm=None,
        )
        self.pool3 = nn.MaxPool2d(2)
        
        # 解码器
        self.up1 = UpSample(
            spatial_dims=2,
            in_channels=256,
            out_channels=128,
            scale_factor=2,
            mode='deconv',
        )
        self.dec1 = Convolution(
            spatial_dims=2,
            in_channels=128,
            out_channels=64,
            kernel_size=3,
            strides=1,
            padding=1,
            act='RELU',
            norm=None,
        )
        
        self.up2 = UpSample(
            spatial_dims=2,
            in_channels=64,
            out_channels=64,
            scale_factor=2,
            mode='deconv',
        )
        self.dec2 = Convolution(
            spatial_dims=2,
            in_channels=64,
            out_channels=32,
            kernel_size=3,
            strides=1,
            padding=1,
            act='RELU',
            norm=None,
        )
        
        self.up3 = UpSample(
            spatial_dims=2,
            in_channels=32,
            out_channels=32,
            scale_factor=2,
            mode='deconv',
        )
        self.dec3 = Convolution(
            spatial_dims=2,
            in_channels=32,
            out_channels=out_channels,
            kernel_size=1,
            strides=1,
            padding=0,
            act=None,
            norm=None,
        )
        self.sigmoid = nn.Sigmoid()
    
    def forward(self, x):
        # 编码
        x = self.enc1(x)
        x = self.pool1(x)
        x = self.enc2(x)
        x = self.pool2(x)
        x = self.enc3(x)
        x = self.pool3(x)
        
        # 解码
        x = self.up1(x)
        x = self.dec1(x)
        x = self.up2(x)
        x = self.dec2(x)
        x = self.up3(x)
        x = self.dec3(x)
        x = self.sigmoid(x)
        
        return x

参数获取与尺寸验证

获取网络结构

python 复制代码
model =  MONAIStyleSegNet(in_channels=3, out_channels=1)
for i in model.named_parameters():
    print(i[0],i[1].size())

获取总参数量

python 复制代码
total_params = sum(p.numel() for p in model.parameters())
trainable_params = sum(p.numel() for p in model.parameters() if p.requires_grad)
print(f"总参数量: {total_params:,}")
print(f"可训练参数量: {trainable_params:,}")

测试输出尺寸

python 复制代码
# 测试
model = MONAIStyleSegNet(in_channels=3, out_channels=1)
x = torch.randn(1, 3, 512, 512)
output = model(x)
print(f"MONAI 网络输出: {output.shape}")
python 复制代码
MONAI 风格网络输出: torch.Size([1, 1, 512, 512])

结尾及相关链接

欧克,MONAI网络也搭建好了。我们下期再聊ദ്ദി (⩌ᴗ⩌ )

相关链接:

示例数据集:

Huỳnh Trịnh Ngọc. A02025-Medical-Image-Segmentation. https://kaggle.com/competitions/a0-2025-medical-image-segmentation, 2025. Kaggle.

MONAI官网:

MONAI - 医疗AI开放网络 - MONAI 框架

Pytorch官网:

PyTorch

对应的Pytorch文章:

Pytorch初上手------网络搭建

相关推荐
Omics Pro1 小时前
3种蛋白结构输入方式!已申报欧洲发明专利
数据库·人工智能·python·机器学习·plotly
Psycho_MrZhang1 小时前
Codex 高效开发协作手册
python
HappyAcmen1 小时前
1.pdfplumber安装,PDF文字提取
python·pdf
弹简特1 小时前
【零基础学Python-收尾】10-Python第三方库的安装介绍
开发语言·python
itfallrain1 小时前
Spring 构造器循环依赖排查:@RequiredArgsConstructor + @Lazy 到底有没有生效
数据库·python·spring
小草cys2 小时前
NVIDIA 驱动(550版本)成功安装后安装支持 GPU 加速的 PyTorch
人工智能·pytorch·python
SilentSamsara2 小时前
Python 微服务全链路:gRPC + 链路追踪 + 服务网格接入
开发语言·分布式·python·微服务·架构
Cloud_Shy6182 小时前
解读《Effective Python 3rd Edition》:从练气到老魔(第三章 Item 21 - 24)
开发语言·人工智能·笔记·python·迭代器模式
张高兴4 小时前
张高兴的 Hailo-10 开发指南:(二)使用 LangChain 搭建本地大模型 RAG 问答应用
python·边缘计算·hailo
财经资讯数据_灵砚智能4 小时前
基于全球经济类多源新闻的NLP情感分析与数据可视化(日间)2026年6月6日
大数据·人工智能·python·ai·信息可视化·自然语言处理·灵砚智能