【干货教学】unet进阶,如何在unet中加入resnet(残差连接)_resnet unet

    super(Res1Unet, self).__init__()

    # down sampling
    # 假如输入 224*224*1 的图像
    # H = ((224 - 3 + 1 + 2 - 1) / 1) + 1 = 224  unet的卷积不会改变特征图的大小
    self.conv1 = DoubleConv(in_ch, 64)
    # to increase the dimensions
    self.w1 = nn.Conv2d(in_ch, 64, kernel_size=1, padding=0, stride=1)
    self.pool1 = nn.MaxPool2d(2)  # 224 -> 112

    self.conv2 = DoubleConv(64, 128)  # 不变
    # to increase the dimensions
    self.w2 = nn.Conv2d(64, 128, kernel_size=1, padding=0, stride=1)
    self.pool2 = nn.MaxPool2d(2)  # 56

    self.conv3 = DoubleConv(128, 256)
    # to increase the dimensions
    self.w3 = nn.Conv2d(128, 256, kernel_size=1, padding=0, stride=1)
    self.pool3 = nn.MaxPool2d(2)  # 28

    self.conv4 = DoubleConv(256, 512)
    # to increase the dimensions
    self.w4 = nn.Conv2d(256, 512, kernel_size=1, padding=0, stride=1)
    self.pool4 = nn.MaxPool2d(2)  # 14

    self.conv5 = DoubleConv(512, 1024)
    # to increase the dimensions
    self.w5 = nn.Conv2d(512, 1024, kernel_size=1, padding=0, stride=1)

    # up sampling
    # H_out = (14 - 1) * 2 + 2 = 28 往上反卷积
    self.up6 = nn.ConvTranspose2d(1024, 512, 2, stride=2)
    self.conv6 = DoubleConv(1024, 512)   # 28

    self.up7 = nn.ConvTranspose2d(512, 256, 2, stride=2)
    self.conv7 = DoubleConv(512, 256)

    self.up8 = nn.ConvTranspose2d(256, 128, 2, stride=2)
    self.conv8 = DoubleConv(256, 128)

    self.up9 = nn.ConvTranspose2d(128, 64, 2, stride=2)
    self.conv9 = DoubleConv(128, 64)

    self.conv10 = nn.Conv2d(64, out_ch, 1)

    # 训练时尝试让神经元失活,加大泛化性,仅在训练时使用,pytorch自动补偿参数
    self.dropout = nn.Dropout(p=0.3)

def forward(self, x):
    # 下采样部分
    down0_res = self.w1(x)  # residual block,残差连接
    down0 = self.conv1(x) + down0_res
    down1 = self.pool1(down0)

    down1_res = self.w2(down1)  # residual block
    down1 = self.conv2(down1) + down1_res
    down2 = self.pool2(down1)

    down2_res = self.w3(down2)
    down2 = self.conv3(down2) + down2_res
    down3 = self.pool3(down2)

    down3_res = self.w4(down3)
    down3 = self.conv4(down3) + down3_res
    down4 = self.pool4(down3)

    down4_res = self.w5(down4)
    # 5 , 连接上采样部分前,双卷积卷积操作    [14, 14, 1024]
    down5 = self.conv5(down4) + down4_res

    # 上采样部分
    up_6 = self.up6(down5)   # [28, 28, 512]
    merge6 = torch.cat([up_6, down3], dim=1)    # cat之后又变为[28, 28, 1024]
    c6 = self.conv6(merge6)   # 重新双卷积变为[28, 28, 512]

    up_7 = self.up7(c6)   # [56, 56, 256]
    merge7 = torch.cat([up_7, down2], dim=1)
    c7 = self.conv7(merge7) # [56, 56, 256]

    up_8 = self.up8(c7)   # [112, 112, 128]
    merge8 = torch.cat([up_8, down1], dim=1)
    c8 = self.conv8(merge8) # [112, 112, 128]

    up_9 = self.up9(c8)   # [224, 224, 64]
    merge9 = torch.cat([up_9, down0], dim=1)
    c9 = self.conv9(merge9)  # [224, 224, 64]

    c10 = self.conv10(c9)  # 卷积输出最终图像   [224, 224, t]

    return c10

在这个例子中,`w1`、`w2`、`w3`、`w4`、`w5`是为了匹配维度而设置的1x1卷积,它们允许我们将原始输入或下采样后的特征添加到特征图中,这样就实现了残差连接。在U-Net的每个编码阶段之后,我们都会加上一个这样的残差连接。


#### 2.2 图示


##### 2.2.1 unet


![在这里插入图片描述](https://img-blog.csdnimg.cn/f1cb487379784fb3bf67955d35aa3b34.png#pic_center)


##### 2.2.2 加入残差连接改进


![在这里插入图片描述](https://img-blog.csdnimg.cn/3381fa50a7434441bed98884eeab2499.png#pic_center)


### 3.为什么要使用ResUnet?


#### 3.1优势


1. **改善梯度流通**:通过加入残差连接,梯度可以直接流经较短的路径,减少训练过程中的梯度消失问题。
2. **加速收敛**:残差连接有助于网络更快地收敛,提高训练效率。
3. **提高性能**:Res1Unet可以更好地捕捉到图像的细节和上下文信息,提高分割的准确性。
 **自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**

**深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**

**因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**

![img](https://img-blog.csdnimg.cn/img_convert/fcfead2ce4ea33e8885359751952a70e.png)

![img](https://img-blog.csdnimg.cn/img_convert/0992433ab201cc764b4415ed5eddacbe.png)

![img](https://img-blog.csdnimg.cn/img_convert/9e9d5546a3e75faa278c12ba05506fb2.png)

![img](https://img-blog.csdnimg.cn/img_convert/91b788cfccb01be381dd20d514cc4511.png)

![img](https://img-blog.csdnimg.cn/img_convert/6c361282296f86381401c05e862fe4e9.png)

![img](https://img-blog.csdnimg.cn/img_convert/9f49b566129f47b8a67243c1008edf79.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!**

**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**

**如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注:Python)**

盖了95%以上前端开发知识点,真正体系化!**

**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**

**如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注:Python)**

![](https://img-blog.csdnimg.cn/img_convert/0d97520089da54aeb94ec4da9f056f21.jpeg)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值