import torch.nn as nn
import torch# 定义应用于18和34层等浅层resnet的残差块
class BasicBlock(nn.Module):expansion = 1  # 该参数决定了每一个残差块的最后层卷积的通道数是前边层的多少倍def __init__(self, in_channel, out_channel, stride=1, dowmsample=None):super(BasicBlock, self).__init__()self.conv1 = nn.Conv2d(in_channel=in_channel, out_channel=out_channel,kernel_size=3, stride=stride, padding=1, bias=False)self.bn1 = nn.BatchNorm2d(out_channel)self.relu = nn.ReLU()self.conv2 = nn.Conv2d(in_channel=out_channel, out_channel=out_channel,kernel_size=3, stride=1, padding=1, bias=False)self.bn2 == nn.BatchNorm2d(out_channel)self.dowmsample = dowmsampledef forward(self, x):identity = x# 如果残差块的输入输出的通道数不同,那么则需要在直连的地方用1*1卷积下采样一次,if self.dowmsample is not None:identity = self.dowmsample(x)out = self.conv1(x)out = self.bn1(out)out = self.relu(out)out = self.conv2(out)out = self.bn2(out)out += identityout = self.relu(out)return out# 定义应用于50,101,152等深层resnet的残差块,由1*1,3*3,1*1的卷积堆叠而成
class Bottleneck(nn.Module):expansion = 4def __init__(self, in_channel, out_channel, stride=1, downsample=None):super(Bottleneck, self).__init__()self.conv1 = nn.Conv2d(in_channels=in_channel, out_channels=out_channel,kernel_size=1, stride=1, bias=False)  # 降维self.bn1 = nn.BatchNorm2d(out_channel)self.conv2 = nn.Conv2d(in_channels=out_channel, out_channels=out_channel,kernel_size=3, stride=stride, bias=False, padding=1)self.bn2 = nn.BatchNorm2d(out_channel)self.conv3 = nn.Conv2d(in_channels=out_channel, out_channels=out_channel * self.expansion,kernel_size=1, stride=1, bias=False)  # 升高维度self.bn3 = nn.BatchNorm2d(out_channel * self.expansion)self.relu = nn.ReLU(inplace=True)self.downsample = downsampledef forward(self, x):identity = xif self.downsample is not None:identity = self.downsample(x)out = self.conv1(x)out = self.bn1(out)out = self.relu(out)out = self.conv2(out)out = self.bn2(out)out = self.relu(out)out = self.conv3(out)out = self.relu(out)return out# 将残差组合起来定义ResNet网络结构
class ResNet(nn.Module):# 初始化参数里,block表示使用哪种残差块,block_num为一个列表,表示每个layer里各有多少个残差块def __init__(self, block, block_num, num_classes=1000, include_top=True):super(ResNet, self).__init__()self.include_top = include_topself.in_channel = 64self.conv1 = nn.Conv2d(3, self.in_channel, kernel_size=7, stride=2,padding=3, bias=False)self.bn1 = nn.BatchNorm2d(self.in_channel)self.relu = nn.ReLU(inplace=True)self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1)self.layer1 = self._make_layer(block, 64, block_num[0])self.layer2 = self._make_layer(block, 128, block_num[1], stride=2)self.layer3 = self._make_layer(block, 256, block_num[2], stride=2)self.layer4 = self._make_layer(block, 512, block_num[3], stride=2)if self.include_top:self.avgpool = nn.AdaptiveAvgPool2d((1, 1))  # output size = (1, 1)self.fc = nn.Linear(512 * block.expansion, num_classes)# 对卷积层进行权重初始化for m in self.modules():if isinstance(m, nn.Conv2d):nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu')def _make_layer(self, block, channel, block_num, stride=1):downsample = Noneif stride != 1 or self.in_channel != channel * block.expansion:downsample = nn.Sequential(nn.Conv2d(self.in_channel, channel * block.expansion, kernel_size=1, stride=stride, bias=False),nn.BatchNorm2d(channel * block.expansion))layers = []layers.append(block(self.in_channel, channel, downsample=downsample,stride=stride))self.in_channel = channel * block.expansionfor _ in range(1,block_num):layers.append(block(self.in_channel,channel))return nn.Sequential(*layers)def forward(self, x):x = self.conv1(x)x = self.bn1(x)x = self.relu(x)x = self.maxpool(x)x = self.layer1(x)x = self.layer2(x)x = self.layer3(x)x = self.layer4(x)if self.include_top:x = self.avgpool(x)x = torch.flatten(x, 1)x = self.fc(x)return xdef resnet34(num_classes=1000, include_top=True):return ResNet(BasicBlock, [3, 4, 6, 3], num_classes=num_classes, include_top=include_top)def resnet101(num_classes=1000, include_top=True):return ResNet(Bottleneck, [3, 4, 23, 3], num_classes=num_classes, include_top=include_top)

Pytorch实现ResNet(DIY版)相关推荐

  1. PyTorch 1.0稳定版正式发布,并向开发者提供免费AI课程

    晓查 发自 凹非寺 量子位 出品 | 公众号 QbitAI Facebook今天在NeurIPS大会上正在发布PyTorch 1.0稳定版. Facebook在5月份公布了该版本的新功能,并在10月举 ...

  2. 图像分类篇:pytorch实现ResNet

    一.ResNet详解 ResNet网络是在2015年由微软实验室提出的,斩获当年ImageNet竞赛中分类任务第一名,目标检测第一名,获得COCO数据集中目标检测第一名,图像分类第一名. 在ResNe ...

  3. 腾讯QQ2006正式 狂人DIY版 Ver20070120

    QQ狂人DIY版,是市面上唯一的一款,可以在安装过程中自动探测并安装最新版"珊瑚虫去广告显IP外挂"的QQ安装程序,并且它还可以在安装完成时让用户很简便地设置珊瑚虫外挂.除此之外, ...

  4. Ubuntu16.04 系统下的pytorch库(cpu版)安装与demo测试

    PyTorch是一个快速,灵活的实验深度学习框架[1].下面介绍Ubuntu16.04 系统及Anaconda环境下,对于pytorch库(cpu版)的安装与demo测试. 系统环境: Ubuntu1 ...

  5. PyTorch 1.0 正式版发布了!

    机器之心编译 GitHub 地址:https://github.com/pytorch/pytorch/releases/tag/v1.0.0 PyTorch 1.0 同时面向产品化 AI 和突破性研 ...

  6. PyTorch 1.10正式版上线了!附相关资源

    广受人们欢迎的深度学习框架 PyTorch 刚刚更新了 1.10 正式版,在 CUDA Graphs API 等方面进行了诸多改进. 本文来源:机器之心 PyTorch 是一个开源的 Python 机 ...

  7. 基于python实现resnet_【深度学习】基于Pytorch的ResNet实现

    1. ResNet理论 残差学习基本单元: 在ImageNet上的结果: 效果会随着模型层数的提升而下降,当更深的网络能够开始收敛时,就会出现降级问题:随着网络深度的增加,准确度变得饱和(这可能不足为 ...

  8. bottleneck resnet网络_Detection学习之四-利用pytorch实现resnet

    残差网络的基本原理 上图即为残差网络的基本原理: F(x)=H(x)-x,x为浅层输出,H(x)为深层的输出,F(x)为二者中间的两层变换.当浅层的x代表的特征已经足够成熟,如果任何对于x的改变都会让 ...

  9. 通过和resnet18和resnet50理解PyTorch的ResNet模块

    文章目录 模型介绍 resnet18模型流程 总结 resnet50 总结 resnet和resnext的框架基本相同的,这里先学习下resnet的构建,感觉高度模块化,很方便.本文算是对 PyTor ...

最新文章

  1. 针对2013年B题碎纸片拼接问题(附件一、附件二)
  2. PHP面试MySQL数据库的索引
  3. linux简单设计与实现代码,《linux内核设计与实现》第五章(示例代码)
  4. ENode 1.0 - 整体架构介绍
  5. android assets解压,Android assets内压缩文件解压,解压到缓存示例
  6. 印象笔记设计经理王怀千:全栈设计师的职业本质
  7. 常见索引结构—FST
  8. 20145129 《Java程序设计》第3周学习总结
  9. 计算机word怎么选中全文,word怎么选择 WORD怎么选取全文
  10. App Transport Security has blocked a cleartext
  11. 【python】牛客竞赛语法入门班选择结构习题 python解法
  12. 租用国外服务器应该注意哪些?
  13. SpringBoot+Thymeleaf实现图片上传和显示
  14. python大数据入门书籍_初学大数据,一定要知道这些
  15. Java入门篇——安装Java SE14
  16. EasyTouch5 之 Joystick 虚拟摇杆
  17. 【Python学习笔记(一)—— 初识Python】
  18. Linux操作系统的管理(操作系统与服务器)二
  19. R语言 echarts4r 不显示图形_9本R语言书,从入门到进阶都在这里了!
  20. andriod 打造炫酷的电影票在线选座控件,1比1还原淘宝电影在线选座功能

热门文章

  1. 1110 区块反转 – PAT乙级真题
  2. VoIP领域中常用的RFC文档
  3. 即时消息:消息收发架构
  4. ZOOM“无法检测到扬声器”解决方案
  5. Kotlin 高阶函数
  6. 福禄克Fluke TiX501 高像素红外热像仪
  7. 非线性信道均衡实验仿真
  8. 丘比特之箭python代码_qq飞车t3代码大全2016 | 手游网游页游攻略大全
  9. 机器学习 2.1.1 最小二乘估计
  10. maya多边形建模怎样做曲面_maya将曲面模型转换成多边形模型