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

相关推荐
benchmark_cc1 天前
如何用 Python + QuantDash 快速构建高胜率“配对交易(Pairs Trading)”策略?
开发语言·人工智能·python·pandas·量化交易·quantdash
Python+991 天前
Java 枚举类(Enum)详解:从基础到高级应用
java·开发语言·python
dunge20261 天前
2026年7月最新ChatGPT Plus / Pro 与 Codex:当 AI Agent 最新5.6版本来袭,必须理解事务、幂等与补偿
开发语言·人工智能·python
小白学大数据1 天前
两周完成爬虫技术栈升级:Scrapy 迁移 Crawlo 的路径与取舍
爬虫·python·scrapy
用户8356290780511 天前
使用 Python 在 Excel 中添加和自定义文本框
后端·python
总裁余(余登武)1 天前
python多个py文件打包【解决exe不能移动运行bug】
python
kisloy1 天前
【python零基础教程第24讲】代码规范与质量管控
开发语言·python
xywww1681 天前
AWS 账号权限怎么分:根用户和 IAM 用户区别及日常使用建议
大数据·开发语言·人工智能·python·gpt·云计算·aws
不羁的木木1 天前
《HarmonyOS技术精讲-NearLink Kit(星闪服务)》第3篇:数据收发——点对点数据传输实战
pytorch·华为·harmonyos
许彰午1 天前
100_Python面试常见问题汇总
java·python·面试