ResNet34+Unet(可以直接用)

ResNet34+Unet(可以直接用)importtorchfromtorchimportnnimporttorch.nn.functionalasF#因为ResNet34包含重复的单元,故用ResidualBlock类来简化代码classResidualBlock(nn.Module):def__init__(self,inchannel,outchannel,stride,shortcut=None):super(ResidualBlock,self).__init__(

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

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


# 因为ResNet34包含重复的单元,故用ResidualBlock类来简化代码
class ResidualBlock(nn.Module):
    def __init__(self, inchannel, outchannel, stride, shortcut=None):
        super(ResidualBlock, self).__init__()
        self.basic = nn.Sequential(
            nn.Conv2d(inchannel, outchannel, 3, stride, 1,
                      bias=False),  # 要采样的话在这里改变stride
            nn.BatchNorm2d(outchannel),  # 批处理正则化
            nn.ReLU(inplace=True),  # 激活
            nn.Conv2d(outchannel, outchannel, 3, 1, 1,
                      bias=False),  # 采样之后注意保持feature map的大小不变
            nn.BatchNorm2d(outchannel),
        )
        self.shortcut = shortcut

    def forward(self, x):
        out = self.basic(x)
        residual = x if self.shortcut is None else self.shortcut(x)  # 计算残差
        out += residual
        return nn.ReLU(inplace=True)(out)  # 注意激活


class Conv2dReLU(nn.Module):
    def __init__(
            self,
            in_channels,
            out_channels,
            kernel_size,
            padding=0,
            stride=1,
    ):
        super(Conv2dReLU, self).__init__()
        self.conv = nn.Conv2d(
            in_channels,
            out_channels,
            kernel_size,
            stride=stride,
            padding=padding,
            bias=False
        )
        self.bn = nn.BatchNorm2d(out_channels)
        self.relu = nn.ReLU(inplace=True)

    def forward(self, x):
        x = self.relu(self.bn(self.conv(x)))
        return x


class DecoderBlock(nn.Module):
    def __init__(
            self,
            in_channels,
            skip_channels,
            out_channels,
    ):
        super().__init__()
        self.conv1 = Conv2dReLU(
            in_channels + skip_channels,
            out_channels,
            kernel_size=3,
            padding=1,
        )
        self.conv2 = Conv2dReLU(
            out_channels,
            out_channels,
            kernel_size=3,
            padding=1,
        )

    def forward(self, x, skip=None):
        x = F.interpolate(x, scale_factor=2, mode="nearest")
        if skip is not None:
            x = torch.cat([x, skip], dim=1)

        x = self.conv1(x)
        x = self.conv2(x)

        return x


class SegmentationHead(nn.Sequential):
    def __init__(self,
                 in_channels=16,
                 out_channels=1,
                 kernel_size=3,
                 upsampling=1):
        conv2d = nn.Conv2d(in_channels,
                           out_channels,
                           kernel_size=kernel_size,
                           padding=kernel_size // 2)
        upsampling = nn.UpsamplingBilinear2d(
            scale_factor=upsampling) if upsampling > 1 else nn.Identity()
        super().__init__(conv2d, upsampling)


# ResNet类
class Resnet34(nn.Module):
    def __init__(self, inchannels):
        super(Resnet34, self).__init__()
        self.pre = nn.Sequential(
            nn.Conv2d(inchannels, 64, 7, 2, 3, bias=False),
            nn.BatchNorm2d(64),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(3, 2, 1),
        )  # 开始的部分
        self.body = self.makelayers([3, 4, 6, 3])  # 具有重复模块的部分
        in_channels = [512, 256, 128, 128, 32]
        skip_channels = [256, 128, 64, 0, 0]
        out_channels = [256, 128, 64, 32, 16]
        blocks = [
            DecoderBlock(in_ch, skip_ch,
                         out_ch) for in_ch, skip_ch, out_ch in zip(
                             in_channels, skip_channels, out_channels)
        ]
        self.blocks = nn.ModuleList(blocks)
        self.seg = SegmentationHead()

    def makelayers(self, blocklist):  # 注意传入列表而不是解列表
        self.layers = []
        for index, blocknum in enumerate(blocklist):
            if index != 0:
                shortcut = nn.Sequential(
                    nn.Conv2d(64 * 2**(index - 1),
                              64 * 2**index,
                              1,
                              2,
                              bias=False),
                    nn.BatchNorm2d(64 * 2**index))  # 使得输入输出通道数调整为一致
                self.layers.append(
                    ResidualBlock(64 * 2**(index - 1), 64 * 2**index, 2,
                                  shortcut))  # 每次变化通道数时进行下采样
            for i in range(0 if index == 0 else 1, blocknum):
                self.layers.append(
                    ResidualBlock(64 * 2**index, 64 * 2**index, 1))
        return nn.Sequential(*self.layers)

    def forward(self, x):
        self.features = []
        # 下采样
        # x = self.pre(x)
        for i, l in enumerate(self.pre):
            x = l(x)
            if i == 2:
                self.features.append(x)

        print("y=", len(self.features))
        for i, l in enumerate(self.body):
            if i == 3 or i == 7 or i == 13:
                self.features.append(x)
            x = l(x)
        skips = self.features[::-1]

        # skips = self.features[1:]

        for i, decoder_block in enumerate(self.blocks):
            skip = skips[i] if i < len(skips) else None
            x = decoder_block(x, skip)

        x = self.seg(x)
        return x

 
 
四次Skipconnect分别在:Maxpool前;另外三次在通道数变化前。
上采样combine时采用的是插值(nn.functionnal.interpolate)。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/185682.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 卷积神经网络如何进行图像识别的

    卷积神经网络如何进行图像识别的在机器视觉的概念中,图像识别是指软件具有分辨图片中的人物、位置、物体、动作以及笔迹的能力。计算机可以应用机器视觉技巧,结合人工智能以及摄像机来进行图像识别。 什么是图像识别?为什么要进行图像识别? 在机器视觉的概念中,图像识别是指软件具有分辨图片中的人物、位置、物体、动作以及笔迹的能力。计算机可以应用机器视觉技巧,结合人工智能以及摄像机来进行图像识别。 …

    2022年6月10日
  • cmd切换盘符命令

    cmd切换盘符命令cmd切换盘符

    2022年10月4日
  • java 程序中的指令重排是什么_指令和程序的区别和联系

    java 程序中的指令重排是什么_指令和程序的区别和联系Java中有两个编译期:1、编译期:调用javac命令将Java代码编译成Java字节码;2、运行期:JIT编译器将字节码编译成机器码。指令重排指令重排是指在程序执行过程中,为了性能考虑,编译器和CPU可能会对指令重新排序。…

    2022年10月17日
  • Delphi XE 5,Rad Studio XE 5 官方下载(附激活成功教程),更新 Update 1,Help Update 1

    Delphi XE 5,Rad Studio XE 5 官方下载(附激活成功教程),更新 Update 1,Help Update 1DelphiXE5激活成功教程,有图有真相EmbarcaderoRADStudioXE5Update2v19.0.14356.6604(等待激活成功教程中…):http://altd.embarcadero.com/download/radstudio/xe5/delphicbuilder_xe5_upd2_win.isohotfix_1_2_3_…

    2022年7月18日
  • 对比java和python对比「建议收藏」

    对比java和python对比「建议收藏」1.难易度而言。python远远简单于java。  2.开发速度。Python远优于java  3.运行速度。java远优于标准python,pypy和cython可以追赶java,但是两者都没有成熟到可以做项目的程度。  4.可用资源。java一抓一大把,python很少很少,尤其是中文资源。  5.稳定程度。python3和2不兼容,造成了一定程度上的混乱以及大批类库失效。ja

    2022年7月8日
  • 应用程序中的服务器错误怎么解决_web服务器和http服务器

    应用程序中的服务器错误怎么解决_web服务器和http服务器在SEO工作的过程中,我们偶尔会遇到HTTP500内部服务器错误,这样的问题,它是一个明显的HTTP状态码,它在告知站长,你的网站与服务器某些配置一定出现问题。从SEO的角度,如果你不能够及时解决相关问题,那么你的网站会面临短期内与百度爬虫失去链接,时间长久的话,会严重影响网站的相关排名。那么,如何解决,HTTP500内部服务器错误?根据以往SEO网站诊断的经历,蝙蝠侠IT,将通过如下内容,进行浅…

    2022年8月11日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号