Resnet50 pytorch复现

之前复现过Resnet18,今天复现与Resnet网络结构稍有不同的Resnet50

Resnet50的基本结构是1x1卷积->3x3卷积->1x1卷积。而每一组卷积是这样的结构:卷积->BN->RELU组合而成。

如果所示,上面左边的为Resnet18,34的残差结构,右边的是Resnet50 101 152的残差结构。从图中可以看出Resnet50 的 1x1的卷积->3x3卷积->1x1卷积结构中,第一个1x1的卷积是进行降维操作,再做3x3的卷积提取特征,再做1x1的卷积进行升维。与Unet的网络不同,这里的残差结构是add操作,即两组同样的shape的权值,对应位置的值进行相加,而Unet中concatenate的操作,是对应宽高的权值,进行通道叠加。

以下代码是基本结构的代码

import torch.nn as nn
import torch.onnxclass Block(nn.Module):def __init__(self, in_channels, channels, stride, downsample=None):super(Block, self).__init__()# 1x1的卷积降维操作self.conv1 = nn.Conv2d(in_channels=in_channels, out_channels=channels, kernel_size=(1, 1),bias=False)self.bn1 = nn.BatchNorm2d(channels)# 3x3的卷积提取特征操作self.conv2 = nn.Conv2d(in_channels=channels, out_channels=channels, kernel_size=(3, 3),stride=stride,padding=1,bias=False)self.bn2 = nn.BatchNorm2d(channels)# 1x1的卷积升维操作self.conv3 = nn.Conv2d(in_channels=channels, out_channels=channels * 4, kernel_size=(1, 1),bias=False)self.bn3 = nn.BatchNorm2d(channels * 4)self.relu = nn.ReLU(inplace=True)self.downsample = downsample# 4组卷积层的头一层网络会做一次降采样if self.downsample is not None:self.dconv = nn.Conv2d(in_channels, channels * 4, stride=stride, kernel_size=(1, 1), bias=False)self.dbn = nn.BatchNorm2d(channels * 4)def forward(self, x):identity = xout = 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.bn3(out)if self.downsample is not None:identity = self.dconv(identity)identity = self.dbn(identity)out += identityout = self.relu(out)return out

以下是主体结构

class Resnet50(nn.Module):def __init__(self, num_classes):super(Resnet50, self).__init__()self.conv1 = nn.Conv2d(3, 64, kernel_size=(7, 7), stride=2, padding=3, bias=False)self.bn1 = nn.BatchNorm2d(64)self.relu1 = nn.ReLU(inplace=True)self.maxpool1 = nn.MaxPool2d(kernel_size=3, stride=2, padding=1)# 对应第1组网络层,3*Resnet的基本结构self.conv64_1 = Block(64, 64, stride=1, downsample=True)self.conv64_2 = Block(256, 64, stride=1)self.conv64_3 = Block(256, 64, stride=1)# 对应第2组网络层,4*Resnet的基本结构self.conv128_1 = Block(256, 128, stride=2, downsample=True)self.conv128_2 = Block(128 * 4, 128, stride=1)self.conv128_3 = Block(128 * 4, 128, stride=1)self.conv128_4 = Block(128 * 4, 128, stride=1)# 对应第3组网络层,6*Resnet的基本结构self.conv256_1 = Block(512, 256, stride=2, downsample=True)self.conv256_2 = Block(256 * 4, 256, stride=1)self.conv256_3 = Block(256 * 4, 256, stride=1)self.conv256_4 = Block(256 * 4, 256, stride=1)self.conv256_5 = Block(256 * 4, 256, stride=1)self.conv256_6 = Block(256 * 4, 256, stride=1)# 对应第4组网络层,3*Resnet的基本结构self.conv512_1 = Block(1024, 512, stride=2, downsample=True)self.conv512_2 = Block(512 * 4, 512, stride=1)self.conv512_3 = Block(512 * 4, 512, stride=1)self.avgpool = nn.AdaptiveAvgPool2d((1,1))self.fc = nn.Linear(2048, num_classes)def forward(self, x):x = self.conv1(x)x = self.bn1(x)x = self.relu1(x)x = self.maxpool1(x)x = self.conv64_1(x)x = self.conv64_2(x)x = self.conv64_3(x)x = self.conv128_1(x)x = self.conv128_2(x)x = self.conv128_3(x)x = self.conv128_4(x)x = self.conv256_1(x)x = self.conv256_2(x)x = self.conv256_3(x)x = self.conv256_4(x)x = self.conv256_5(x)x = self.conv256_6(x)x = self.conv512_1(x)x = self.conv512_2(x)x = self.conv512_3(x)x = self.avgpool(x)x = torch.flatten(x, 1)x = self.fc(x)return xif __name__ == '__main__':model = Resnet50(1000)from torchsummary import summaryprint(summary(model, (3, 224, 224)))torch.onnx.export(model, torch.randn(1,3,224,224),r"Y:\code\python\202203\Resnet50.onnx")

下图是Resnet50的网络结构图

Resnet50 pytorch复现相关推荐

  1. 我用 PyTorch 复现了 LeNet-5 神经网络(自定义数据集篇)!

    大家好,我是红色石头! 在上三篇文章: 这可能是神经网络 LeNet-5 最详细的解释了! 我用 PyTorch 复现了 LeNet-5 神经网络(MNIST 手写数据集篇)! 我用 PyTorch ...

  2. 我用 PyTorch 复现了 LeNet-5 神经网络(CIFAR10 数据集篇)!

    大家好,我是红色石头! 在上两篇文章: 这可能是神经网络 LeNet-5 最详细的解释了! 我用 PyTorch 复现了 LeNet-5 神经网络(MNIST 手写数据集篇)! 详细介绍了卷积神经网络 ...

  3. 【深度学习】我用 PyTorch 复现了 LeNet-5 神经网络(自定义数据集篇)!

    在上三篇文章: 这可能是神经网络 LeNet-5 最详细的解释了! 我用 PyTorch 复现了 LeNet-5 神经网络(MNIST 手写数据集篇)! 我用 PyTorch 复现了 LeNet-5 ...

  4. NVIDIA新作解读:用GAN生成前所未有的高清图像(附PyTorch复现) | PaperDaily #15

    在碎片化阅读充斥眼球的时代,越来越少的人会去关注每篇论文背后的探索和思考. 在这个栏目里,你会快速 get 每篇精选论文的亮点和痛点,时刻紧跟 AI 前沿成果. 点击本文底部的「阅读原文」即刻加入社区 ...

  5. 亚像素卷积网络(ESPCN)学习与Pytorch复现

    论文内容 论文地址:Real-Time Single Image and Video Super-Resolution Using an Efficient Sub-Pixel Convolution ...

  6. Pytorch复现FCN网络

    Pytorch复现FCN网络详解(可复现) 1.环境配置 windows10,pytorch=1.3,python=3.6 参考博客:https://github.com/wkentaro/pytor ...

  7. CV+Deep Learning——网络架构Pytorch复现系列——Detection(一:SSD:Single Shot MultiBox Detector 4.推理Detect)

    上一话 CV+Deep Learning--网络架构Pytorch复现系列--Detection(一:SSD:Single Shot MultiBox Detector 3.loss)https:// ...

  8. 【医学图像分割网络】之Res U-Net网络PyTorch复现

    [医学图像分割网络]之Res U-Net网络PyTorch复现 1.内容 U-Net网络算是医学图像分割领域的开山之作,我接触深度学习到现在大概将近大半年时间,看到了很多基于U-Net网络的变体,后续 ...

  9. 心中无码,自然高清 | 联合去马赛克与超分辨率研究论文Pytorch复现

    作者 | 知凡,个人公众号:林木蔚然读书会(ID:EspressoOcean),知乎ID:Uno Whoiam 本文授权转载自知乎 本文结构 简单扫盲 什么是去马赛克 什么是超分辨率 <Deep ...

最新文章

  1. Matlab大气湍流退化模型
  2. 表单之label标签
  3. oracle--表,用户,授权
  4. c++string 输入换行符
  5. python matplotlib模块——绘制三维图形、三维数据散点图
  6. ASP.NET开发,简化与封装
  7. 启动TOMCAT报错 java.util.zip.ZipException: invalid LOC header (bad signature)
  8. 腾讯视频怎么上传自己的视频?
  9. 空格html怎么使用,HTML里空格应该如何使用
  10. 华为面试题之洞穴逃生
  11. matlab-基础 取整函数 向0取整 取最近整数 向上取整 向下取整
  12. Linux查询状态的命令,LINUX常用的系统状态查询命令
  13. 简单实用的出入库管理系统,帮你实现库存精细化管理!
  14. JimuReport积木报表打印多出一页空白页问题(解决方案)
  15. c++中cout、cerr、clog的区别
  16. 批量读取和写出excel数据#R语言#
  17. XSS短字符短域名绕过,XSS相关的知识
  18. 【性能|优化】TB级flink任务报错分析:Could not compute the container Resource
  19. 2015年蓝桥杯预赛第二题星系炸弹
  20. axios的简单封装

热门文章

  1. 【转】组策略软件限制策略规则包编写之菜鸟入门(修正版)
  2. linux--代码对比工具Meld Diff
  3. 计算机组装与维修技术课本,计算机组装与维修技术教程——21世纪高等学校培养应用型人才教材·计算机系列...
  4. 哪个项目管理工具好用到哭?JIRA VS 华为软件开发云
  5. 运用EXCEL制作周报小记
  6. Python入门 小笔记(一)
  7. android应用开发全程实录-你有多熟悉listview?
  8. 文科转码人第一个项目记录——B站动力节点《米米商城》
  9. c# print html,在C#中打印格式化的HTML页面
  10. Delphi语言的VCL框架