pytorch实现resnet网络结构

article/2025/9/16 5:54:49

ResNet结构和pytorch实现
在这里插入图片描述
resnet的网络结构都是经过5个不同数量的残差块+最后一个全连接分类完成的。

在resnet50以后,由于层数的增加残差块发生了变化,从原来3x3卷积变为三层卷积,卷积核分别为1x1、3x3、1x1,减少了网络参数。主要通过两种方式:1.用zero-padding去增加维度 2.用1x1卷积来增加维度
在这里插入图片描述

这是我之前做的读书笔记,忘记看的什么书了,就不加引用了,抱歉

from torch import nn
import torch as t
from torch.nn import functional as F
import cv2class ResdiualBlock(nn.Module):"""实现子module:Residual Block"""def __init__(self, inchannel, outchannel, stride=1, shortcut=None):super(ResdiualBlock, self).__init__()self.left = nn.Sequential(nn.Conv2d(inchannel, outchannel, 3, stride, 1, bias=False),nn.BatchNorm2d(outchannel),nn.ReLU(inplace=True),nn.Conv2d(outchannel, outchannel, 3, 1, 1, bias=False),nn.BatchNorm2d(outchannel))self.right = shortcutdef forward(self, x):out = self.left(x)residual = x if self.right is None else self.right(x)out += residualreturn F.relu(out)class ResNet(nn.Module):"""实现主Module:ResNet34ResNet34包含多个layer, 每个layer又包含多个residual block用子module实现residual block, 用_make_layer函数实现layer"""def __init__(self, num_classes=1000):super(ResNet, self).__init__()# 图像转换self.pre = nn.Sequential(# in_channel, out_channel, kernel_size, stride, paddingnn.Conv2d(3, 64, 7, 2, 3, bias=False, ),nn.BatchNorm2d(64),nn.ReLU(inplace=True),nn.MaxPool2d(3, 2, 1))# 重复的layer, 分别有3,4,6,3 个residual blockself.layer1 = self._make_layer(64, 128, 3)self.layer2 = self._make_layer(128, 256, 4, stride=2)self.layer3 = self._make_layer(256, 512, 6, stride=2)self.layer4 = self._make_layer(512, 512, 3, stride=2)# 全连接分类self.fc = nn.Linear(512, num_classes)def _make_layer(self, inchannel, outchannel, block_num, stride=1):"""构建residual block"""shortcut = nn.Sequential(nn.Conv2d(inchannel, outchannel, 1, stride, bias=False),nn.BatchNorm2d(outchannel))layers = []layers.append(ResdiualBlock(inchannel, outchannel, stride, shortcut))for i in range(1, block_num):layers.append(ResdiualBlock(outchannel, outchannel))return nn.Sequential(*layers)def forward(self, x):x = self.pre(x)x = self.layer1(x)x = self.layer2(x)x = self.layer3(x)x = self.layer4(x)x = F.avg_pool2d(x, 7)x = x.view(x.size(0), -1)return self.fc(x)model = ResNet()
# input = t.autograd.Variable(t.randn(1,2,244,244))
# out = model(input)print(model)

查看pytorch提供的resnet的网络结构

import torch
from torchvision import models
from torchsummary import summaryresnet = models.resnet101()
print(resnet)
summary(resnet, (3, 224, 224), device='cpu')

下面进行用pytorch实现resnet101网络,resnet50和152只是残差块数量不同,其他一致。

代码有点乱,望多多包含

import torch
from torchvision import models
from torchsummary import summary
from torch import nn
from torch.nn import functional as Fresnet = models.resnet101()
print(resnet)
summary(resnet, (3, 224, 224), device='cpu')class ResNet101(nn.Module):def __init__(self, in_channels, num_class):super(ResNet101, self).__init__()self.in_channels = in_channelsself.out_channels = num_classself.pre = nn.Sequential(nn.Conv2d(in_channels, 64, kernel_size=(7, 7), stride=2, padding=3),nn.BatchNorm2d(64),nn.ReLU(inplace=True),nn.MaxPool2d(3, stride=2, padding=1))self.conv2 = self._make_layer(64, 64, 3, stride=1)self.conv3 = self._make_layer(256, 128, 4, stride=2)self.conv4 = self._make_layer(512, 256, 23, stride=2)self.conv5 = self._make_layer(1024, 512, 3, stride=2)self.pool = nn.AvgPool2d(7, stride=1)self.linear = nn.Linear(2048, num_class)def _make_layer(self, in_channels, out_channels, block_num, stride=1, expansion=4):layer = []layer.append(Bottleneck(in_channels, out_channels, stride=stride, sample=True))for i in range(1, block_num):layer.append((Bottleneck(out_channels * expansion, out_channels)))return nn.Sequential(*layer)def forward(self, x):x = self.pre(x)x = self.conv2(x)x = self.conv3(x)x = self.conv4(x)x = self.conv5(x)print(x.size())x = self.pool(x)x = x.view(x.size(0), -1)x = self.linear(x)return xclass Bottleneck(nn.Module):def __init__(self, in_channels, out_channels, stride=1, sample=False, expansion=4):super(Bottleneck, self).__init__()self.in_channels = in_channelsself.out_channels = out_channelsself.expansion = expansionself.sample = sampleself.block = nn.Sequential(nn.Conv2d(in_channels, out_channels, kernel_size=1,stride=1),nn.BatchNorm2d(out_channels),nn.ReLU(),nn.Conv2d(out_channels, out_channels, kernel_size=3, stride=stride, padding=1),nn.BatchNorm2d(out_channels),nn.ReLU(),nn.Conv2d(out_channels, out_channels * expansion, kernel_size=1, stride=1),nn.BatchNorm2d(out_channels * expansion),nn.ReLU())if self.sample:self.downsample = nn.Sequential(nn.Conv2d(in_channels, out_channels * expansion, kernel_size=1, stride=stride),nn.BatchNorm2d(out_channels * expansion))def forward(self, x):out = self.block(x)print(out.size())residual = self.downsample(x) if self.sample is not False else xout += residualreturn F.relu(out)if __name__ == "__main__":res = ResNet101(3, 10)print(res)input = torch.randn(1, 3, 224, 224)out = res(input)print(out.shape)# summary(res, (3, 512, 512), device='cpu')    #太占用内存

介绍我在实现过程中遇到的问题,期间参考的博客在下方提供链接。

问题1.在101_layer中conv2_x中最后一层256通道的1x1卷积在conv3_x怎么变成了128。

下图说明其卷积操作的过程
在这里插入图片描述

第二个问题是输出的feature map是通过设置卷积的stride来逐倍缩小的。

参考:

https://blog.csdn.net/shanglianlm/article/details/86376627


http://chatgpt.dhexx.cn/article/O205eApY.shtml

相关文章

ResNet网络结构搭建

ResNet 下图为包含有18层(17个卷积层和1个全连接层)、34层(33个卷积层和1个全连接层)、50层(49个卷积层和1个全连接层)、101层(100个卷积层和1个全连接层)、152层(151个卷积层和1个全连接层)的resnet结构 下图是论文中给出的两种残差结构。左边的残差结构是针对层数较少网络&a…

ResNet网络结构

注:深度好像就是channel w*h*c 根据b站up霹雳吧啦的讲解做的笔记 视频地址6.1 ResNet网络结构,BN以及迁移学习详解_哔哩哔哩_bilibiliR 6.2 使用pytorch搭建ResNet并基于迁移学习训练_哔哩哔哩_bilibili ResNet网络解决梯度消失、爆炸,以及…

经典网络ResNet介绍

经典网络ResNet(Residual Networks)由Kaiming He等人于2015年提出,论文名为《Deep Residual Learning for Image Recognition》,论文见:https://arxiv.org/pdf/1512.03385.pdf ResNet要解决的是深度神经网络的”退化(degradation)”问题&…

六、ResNet网络详细解析(超详细哦)

1、 RestNet网络 1.1、 RestNet网络结构 ResNet在2015年被提出,在ImageNet比赛classification任务上获得第一名,因为它“简单与实用”并存,之后很多方法都建立在ResNet50或者ResNet101的基础上完成的,检测,分割&…

ResNet结构

文章目录 系列文章目录一、Residual net(残差网络)二、BatchNormalization(BN)三、ResNet结构 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开…

深度学习之图像分类(七)--ResNet网络结构

深度学习之图像分类(七)ResNet 网络结构 目录 深度学习之图像分类(七)ResNet 网络结构1. 前言2. Residual3. 网络配置4. 代码 本节学习ResNet网络结构,以及迁移学习入门,学习视频源于 Bilibili,…

[NCTF2019]SQLi 1regexp注入

[NCTF2019]SQLi&regexp注入 知识点: 无引号闭合,可以利用转义符 \ %00作为截断字符可以代替注释符#和-- - regexp注入可以配合 ^ 来爆破字符 解题: 打开题目得到: 可以看做插入语句: select * from users where…

buuctf-[NCTF2019]Keyboard

题目是这样子的: 下载完压缩包并解压后打开txt文件,发现是这样一串密文: 其实答案就在问题题目中,keyboard是键盘的意思,那结果显而易见了,o y i w u e u y u w u i i e不难发现,这些字母在键盘…

NCTF Crypto WriteUp

http://ctf.nuptzj.cn/challenges Crypto篇: 第一题、第二题、第七题和CG-CTF一样,不写了… 第三题: 说了全家桶,那就python跑吧… Flag:nctf{base64_base32_and_base16} 150分到手 第四题: 鬼知道进行…

[NCTF2019]Fake XML cookbook

BUUCTF 刷题 [NCTF2019]Fake XML cookbook BUUCTF 刷题前言一、[NCTF2019]Fake XML cookbook总结 前言 通过刷题拓宽自己的知识面 一、[NCTF2019]Fake XML cookbook (1)打开后如图所示 (2)尝试了一下万能密码,没啥用…

[NCTF2019]True XML cookbook

打开环境,看到熟悉的页面,和前面的[NCTF2019]Fake XML cookbook页面一样,应该也是XXE漏洞,这里再介绍一下XXE漏洞: XXE(XML External Entity Injection)全称为XML外部实体注入。 XML是什么? XML指可扩展…

[NCTF2019]Sore

[NCTF2019]Sore 附件: ciphertext.txt: nsfAIHFrMuLynuCApeEstxJOzniQuyBVfAChDEznppfAiEIDcyNFBsCjsLvGlDtqztuaHvHbCmuyGNsIMhGlDtbotCoDzDjhyBzHGfHGfoHsuhlssIMvwlixBHHGfDRjoCKrapNIwqNyuxIBACQhtMwCmMCfEBpsrzEuiLGBoMipTkxrznoHfAkqwzvxuzCzDbL…

[NCTF2019]babyRSA1

1.题目代码: # from Crypto.Util.number import * # from flag import flag # # def nextPrime(n): # n 2 if n & 1 else 1 # while not isPrime(n): # n 2 # return n # # p getPrime(1024) # q nextPrime(p) # n p * q # e 0x1000…

[NCTF 2018]Easy_Audit

1.打开环境,发现就是php套娃。 $_REQUEST:PHP的内置变量,是一个数组,保存传递的参数,它的特性是如果get,post一起传参,则会优先post传参,可以由此进行变量覆盖。 $_SERVER:PHP的内置变量,是一个…

第十届南京邮电大学网络攻防大赛(NCTF 2021)writeup

Web X1cT34m_API_System Author:wh1sper 题目描述:在API安全的新时代,安全圈迎来风云变幻。掀起巨浪的你?只手遮天的你?选择保护还是放弃你的曾经的伙伴?target: http://129.211.173.64:58082/ 附件链接&am…

[NCTF 2018]签到题

这题呢 看题目说签到题目 我们可以看出来 我们用F12看源代码 去搜索一下flag值在哪里 但是我们看了没有 我

NCTF2021——wp

文章目录 一、REHello せかいShadowbringer鲨鲨的秘密 二、MISC做题做累了来玩玩游戏吧Hex酱的秘密花园Hello File Format 一、RE Hello せかい ida反编译,flag明文给出 Shadowbringer 那两个函数是2次base64变异码表的编码,函数反过来换两次码表解码…

NCTF2022 calc题目复现

calc(环境变量注入getshell) 经典计算器题目,看着有点眼熟,没错,就是buu三月赛的一道题目。由于那时候web可能都算不上入门,所以也就没有复现。比赛时就网上看了看三月赛的wp,但是没有什么用&a…

[NCTF2019]SQLi

[NCTF2019]SQLi 进入页面,尝试万能密码登录: 觉得有waf,爆破一下 发现过滤了相当多的可用字符串 另外在robots.txt文件中有提示 再进入hint.txt 看到了黑名单,并且说要让查找admin的密码, 但是admin在黑名单中&am…

BUUCTF:[NCTF2019]phar matches everything

题目地址&#xff1a;https://buuoj.cn/challenges#[NCTF2019]phar%20matches%20everything 源码地址&#xff1a;https://github.com/swfangzhang/My-2019NCTF/tree/master/phar matches everything catchmime.php //catchmime.php <?php class Easytest{protected $tes…