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初上手------网络搭建

相关推荐
weixin_444012931 小时前
如何在多实例管理时隐藏MySQL版本信息_安全混淆与配置
jvm·数据库·python
weixin_459753941 小时前
SQL处理大规模分组聚合的内存限制_调整服务器配置
jvm·数据库·python
Rust语言中文社区2 小时前
【Rust日报】2026-05-14 Pyrefly v1.0 正式发布:快速的 Python 类型检查器和语言服务器
开发语言·后端·python·rust
2601_956139422 小时前
广州VI设计公司哪家强
linux·运维·服务器·python
databook2 小时前
让数学公式自动推导
python·数学·动效
m0_733565462 小时前
如何指定PHP版本运行phpMyAdmin_多版本共存配置
jvm·数据库·python
love530love3 小时前
ComfyUI MediaPipe 猴子补丁终极完善版:补全上下文管理与姿态检测兼容
人工智能·windows·python·comfyui·protobuf·mediapipe
小小编程路3 小时前
新手快速学 Python 极简速成指南
开发语言·c++·python
小马过河R3 小时前
RAG检索优化策略:系统性四层框架解析
人工智能·python·算法·ai·llm·rag·问答