unet 网络结构

UNet是一种15年提出的深度学习模型,专为医学图像分割任务设计。该网络由特征提取和特征融合两部分构成,通过特征拼接实现信息的上下文融合,有效结合低分辨率的详细信息和高分辨率的抽象特征。其对称的U型结构确保了特征的彻底融合,尤其在处理图像细节和上下文时表现出色。

unet 是15年提出的用于解决医学图像分割问题。unet有两部分组成。左边部分可以看出是特征提取网络,用于提取图像的抽象特征。右边可以看作是特征融合操作。与传统的FCN相比,unet使用是使用特征拼接实现特征的融合。unet 通过特征融合操作,实现了浅层的低分辨率(越底层的信息含有越多的细节信息)和深层的高分辨率信息(深层信息含有更多的抽象特征)的融合,充分了利用了图像的上下文信息,使用对称的U型结构使得特征融合的更加彻底。

上图是unet 的网络结构图。其中蓝色方框代表的是特征图。可以看到,左边部分首先进行两层卷积然后进行下采样来提取特征。右边,通过上采样操作后与相应的左边的特征图进行拼接操作。 

 

from torch import nn
import torch
from torch.nn import functional as F


class Conv_Block(nn.Module):  # 卷积
    def __init__(self, in_channel, out_channel):
        super(Conv_Block, self).__init__()
        self.layer = nn.Sequential(
            ####填充的方式,填充的大小,padding_mode 设置填充的方式   ###这里卷积图
### Unet 网络架构细节与实现 Unet 是一种用于医学图像分割的卷积神经网络,其核心设计理念在于通过结合上下文信息和高分辨率特征来提高分割精度。以下是关于 Unet 网络结构及其实现的关键点: #### 1. 收缩路径 (Contracting Path) Unet 的收缩路径类似于标准的卷积神经网络,主要负责捕捉输入图像中的上下文信息。此部分由一系列卷积层和池化操作组成。每次卷积都会提取更高层次的特征,而最大池化则逐步降低特征图的空间维度。 具体来说,在每一层中执行两次 \(3 \times 3\) 卷积[^2],随后应用 ReLU 激活函数以及一次 \(2 \times 2\) 最大池化操作以减少空间尺寸。这种设计有助于保留更多的局部细节并逐渐增加感受野大小。 ```python import torch.nn as nn class ContractingBlock(nn.Module): def __init__(self, in_channels, out_channels): super(ContractingBlock, self).__init__() self.conv1 = nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1) self.relu = nn.ReLU(inplace=True) self.conv2 = nn.Conv2d(out_channels, out_channels, kernel_size=3, padding=1) self.pool = nn.MaxPool2d(kernel_size=2, stride=2) def forward(self, x): x = self.relu(self.conv1(x)) x = self.relu(self.conv2(x)) pooled_x = self.pool(x) return x, pooled_x ``` #### 2. 扩展路径 (Expanding Path) 扩展路径是对称于收缩路径的部分,主要用于恢复空间分辨率并生成精确的像素级预测。在此过程中引入了跳跃连接机制,即将来自收缩阶段相同尺度的特征映射拼接到当前层上,从而融合低级别的位置信息与高级别的语义表示。 每一步先利用双线性插值或者转置卷积 (\(2 \times 2\)) 将特征图放大两倍,接着附加先前保存下来的对应区域特征向量再经历若干次常规卷积处理。 ```python class ExpandingBlock(nn.Module): def __init__(self, in_channels, out_channels): super(ExpandingBlock, self).__init__() self.upconv = nn.ConvTranspose2d(in_channels, out_channels // 2, kernel_size=2, stride=2) self.conv1 = nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1) self.relu = nn.ReLU(inplace=True) self.conv2 = nn.Conv2d(out_channels, out_channels, kernel_size=3, padding=1) def forward(self, x, skip_connection): upsampled_x = self.upconv(x) concatenated = torch.cat([upsampled_x, skip_connection], dim=1) x = self.relu(self.conv1(concatenated)) x = self.relu(self.conv2(x)) return x ``` #### 3. 输出层 (Output Layer) 最终输出层采用单个 \(1 \times 1\) 卷积核完成分类任务,将通道数调整为目标类别数目。对于二值分割问题而言即设置为两个;如果是多标签情况,则需匹配实际需求设定相应数量。 ```python class OutputLayer(nn.Module): def __init__(self, in_channels, num_classes): super(OutputLayer, self).__init__() self.final_conv = nn.Conv2d(in_channels, num_classes, kernel_size=1) def forward(self, x): output = self.final_conv(x) return output ``` 整个 U-Net 结构可以通过组合以上模块构建而成,并支持端到端训练过程。值得注意的是,尽管原始版本仅使用少量标注图片即可达到良好效果,但在现代实践中通常会配合更多样化的预处理手段进一步提升泛化能力[^2]。 --- ### 实现完整代码片段 下面展示了一个简化版 PyTorch 风格的 U-Net 定义: ```python class UNet(nn.Module): def __init__(self, input_channels, base_features, num_classes): super(UNet, self).__init__() # Define contracting path layers self.contract_1 = ContractingBlock(input_channels, base_features) self.contract_2 = ContractingBlock(base_features, base_features * 2) self.contract_3 = ContractingBlock(base_features * 2, base_features * 4) # Bottleneck layer self.bottleneck = ContractingBlock(base_features * 4, base_features * 8) # Define expanding path layers self.expand_1 = ExpandingBlock(base_features * 8, base_features * 4) self.expand_2 = ExpandingBlock(base_features * 4, base_features * 2) self.expand_3 = ExpandingBlock(base_features * 2, base_features) # Final output layer self.output_layer = OutputLayer(base_features, num_classes) def forward(self, x): down1, pool1 = self.contract_1(x) down2, pool2 = self.contract_2(pool1) down3, pool3 = self.contract_3(pool2) bottleneck_out, _ = self.bottleneck(pool3) expand1 = self.expand_1(bottleneck_out, down3) expand2 = self.expand_2(expand1, down2) expand3 = self.expand_3(expand2, down1) final_output = self.output_layer(expand3) return final_output ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一壶浊酒..

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值