pytorch学习:ResNet的实现

PyTorch学习之路:ResNet-34实现CIFAR10分类 本代码参考廖星宇《深度学习入门之PyTorch》中的示例代码,手动拼接复现而来,仅供个人使用,侵删。 #ResNet实现CIFAR10分类 from datetime import datetime import torch import torch.nn.functional as F from torch import nn from torch.autograd import Varia... 阅读详情

resnet原理解释
结合图片理解更加好:
在这里插入图片描述

import torch
import torch.nn as nn
import torchvision

print("PyTorch Version: ",torch.__version__)
print("Torchvision Version: ",torchvision.__version__)

__all__ = ['ResNet50', 'ResNet101','ResNet152']

def Conv1(in_planes, places, stride=2):
    return nn.Sequential(
        nn.Conv2d(in_channels=in_planes,out_channels=places,kernel_size=7,stride=stride,padding=3, bias=False),
        nn.BatchNorm2d(places),
        nn.ReLU(inplace=True),
        nn.MaxPool2d(kernel_size=3, stride=2, padding=1)
    )

class Bottleneck(nn.Module):
    def __init__(self,in_places,places, stride=1,downsampling=False, expansion = 4):
        super(Bottleneck,self).__init__()
        self.expansion = expansion     
        #这个expansion是为了实现在1*1卷积时,扩展channel数量,匹配下一层的输入channel数量。4*64=256
        self.downsampling = downsampling
        #是否需要下采样跳连接部分,这主要取决于neck网络输出的大小,与原来的图像的大小。

        self.bottleneck = nn.Sequential(
            nn.Conv2d(in_channels=in_places,out_channels=places,kernel_size=1,stride=1, bias=False),
            nn.BatchNorm2d(places),
            nn.ReLU(inplace=True),
            nn.Conv2d(in_channels=places, out_channels=places, kernel_size=3, stride=stride, padding=1, bias=False),
            nn.BatchNorm2d(places),
            nn.ReLU(inplace=True),
            nn.Conv2d(in_channels=places, out_channels=places*self.expansion, kernel_size=1, stride=1, bias=False),
            nn.BatchNorm2d(places*self.expansion),
        )

        if self.downsampling:
            self.downsample = nn.Sequential(
                nn.Conv2d(in_channels=in_places, out_channels=places*self.expansion, kernel_size=1, stride=stride, bias=False),
                nn.BatchNorm2d(places*self.expansion)
            )
        self.relu = nn.ReLU(inplace=True)

    def forward(self, x):
        residual = x
        out = self.bottleneck(x)

        if self.downsampling:
            residual = self.downsample(x)

        out += residual
        out = self.relu(out)
        return out

class ResNet(nn.Module):
    def __init__(self,blocks, num_classes=1000, expansion = 4):
        super(ResNet,self).__init__()
        self.expansion = expansion

        self.conv1 = Conv1(in_planes = 3, places= 64)

        self.layer1 = self.make_layer(in_places = 64, places= 64, block=blocks[0], stride=1)
        self.layer2 = self.make_layer(in_places = 256,places=128, block=blocks[1], stride=2)
        self.layer3 = self.make_layer(in_places=512,places=256, block=blocks[2], stride=2)
        self.layer4 = self.make_layer(in_places=1024,places=512, block=blocks[3], stride=2)

        self.avgpool = nn.AvgPool2d(7, stride=1)
        self.fc = nn.Linear(2048,num_classes)

        for m in self.modules():
            if isinstance(m, nn.Conv2d):
                nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu')
            elif isinstance(m, nn.BatchNorm2d):
                nn.init.constant_(m.weight, 1)
                nn.init.constant_(m.bias, 0)

    def make_layer(self, in_places, places, block, stride):
        layers = []
        layers.append(Bottleneck(in_places, places,stride, downsampling =True))
        for i in range(1, block):
            layers.append(Bottleneck(places*self.expansion, places))

        return nn.Sequential(*layers)


    def forward(self, x):
        x = self.conv1(x)

        x = self.layer1(x)
        x = self.layer2(x)
        x = self.layer3(x)
        x = self.layer4(x)

        x = self.avgpool(x)
        x = x.view(x.size(0), -1)
        x = self.fc(x)
        return x

def ResNet50():
    #https://www.cnblogs.com/ymjyqsx/p/9867712.html
    #这里就是resnet中的step1,2,3,4
    #对应初试化里的blocks,是卷积层的个数
    return ResNet([3, 4, 6, 3])

def ResNet101():
    return ResNet([3, 4, 23, 3])

def ResNet152():
    return ResNet([3, 8, 36, 3])


if __name__=='__main__':
    #model = torchvision.models.resnet50()
    model = ResNet50()
    print(model)

    input = torch.randn(1, 3, 224, 224)
    out = model(input)
    print(out.shape)

参考来自于:
代码来源
知乎专栏
博客

Pytorch: ResNet论文学习解析网络结构并pytorch实现 正好课程作业需要用到迁移学习,就顺便学习了很厉害的ResNet网络,是真的厉害呀。 首先给出最具有权威性的论文原文。 论文地址:文章目录1、ResNet的亮点2、ResNet网络结构解析3、pytorch利用ResNet进行迁移学习 1、ResNet的亮点 1.1、现在的网络层数越来越多,很有可能出现梯度消失和梯度爆炸的问题-----resnet利用了BN(Batch Normalization)方式 1.2、如果只采用扁平的plain结构的网络,层数过高反而精度越低这类的退化问题----resnet采. 阅读详情

相关推荐

ResNet50网络架构详解:从残差学习到PyTorch实现与训练技巧

在深度神经网络中,梯度消失和网络退化是训练深层模型时常见的挑战,它们会阻碍模型性能随深度增加而提升。残差学习通过引入跳跃连接,让网络层学习输入与目标输出之间的残差,而非直接映射,这有效缓解了梯度问题,使信息能跨层直接传播。其技术价值在于让训练数百甚至上千层的超深网络成为可能,极大提升了模型的特征表达能力。这一原理在计算机视觉领域应用广泛,尤其在图像分类、目标检测等任务中。ResNet50作为该家族的经典代表,采用瓶颈结构设计,通过1x1卷积进行先降维再升维,在计算效率和模型性能间取得平衡。本文结合PyTor

weixin_34378969的博客 669

torchvision中的resnet的实现

一、ResNet网络模型详解 1.1 整体结构 可以看到,resnet34主要就是由layer1-4组成。而这4个layer分别就是由3、4、6、3个BasicBlock堆叠而成。 BasicBlock有两种: 右边虚线的BasicBlock主要用在layer2-4的第一块。作用就是要保证主分支和shortcut的输出特征shape相同。 1.2详细介绍 前面: 输入图片尺寸:224*224*3 conv1: 输入通道是3,输出通道是...

liupc的学习笔记 3892

torchvision_resnet:在torchvision.resnet上进行一些测试

torchvision_resnet 在torchvision.resnet上进行一些测试 在使用代码之前,请下载CIFAR10数据集。 然后将数据集中的路径更改为磁盘中的实际数据集路径。 当纪元为201时, linux分支中的1454e48f82e279707f33b2872a14857d4b00f726 Acc已达到99%。 所有结果都没有数据扩充。 ID 达塞特 手动下载数据集 洗牌 acc 0 火炬视觉 不 是的 99% 1个 矿 是的 是的 60% 2 火炬视觉 不 不 99% 3 矿 是的 不 60% 4 火炬视觉 是的 不 99% 5 我继承了VisionDataset 是的 不 68%

torch学习 (二十六):残差网络 (ResNet)

首先思考这样一个问题:   对神经网络添加新的层,充分训练后的模型是否只可能更有效地降低训练误差?\color{red}^{[1]} [1] 理论上,原模型解的空间只是新模型解的空间的子空间,即如果能将新添加的层训练成恒等映射f (x) = xf(x)=x,新模型和原模型将同样有效。   由于新模型可能得到更优的解来拟合训练数据集,因此添加层似乎更容易降低训练误差。   然后在实践中,添加过多的层后训练误差往往不降反升。即使使用批量归一化带来的数值稳定使得训练深层模型更加容易,但问题仍然存在。   残差

因吉的博客 4183

Resnet Pytorch算法复现

这是一个基于PyTorch实现的ResNet资源,ResNet是一种深度残差网络,被广泛应用于图像分类任务。该资源提供了ResNet在PyTorch框架下的完整实现代码,方便研究者和开发者进行模型训练和应用。ResNet通过引入残差连接解决了深度网络训练中的梯度消失和梯度爆炸问题,使得网络可以更深更容易训练。该实现包含了各个版本的ResNet,如ResNet-18、ResNet-34、ResNet-50等,用户可以根据自己的需求选择适合的模型进行使用。此外,该资源还提供了预训练的权重文件,可以直接加载并在自己的数据集上进行微调或特征提取。无论是学术研究还是工程应用,这个基于PyTorch实现的ResNet资源都将为你的项目提供强大的支持。

gradle报错:A problem occurred configuring root project ‘My Application‘.

即使翻译了,我开始也看不懂,到处找网上教程,但都是改环境变量。马虎的我即使看了很多遍,改了很多遍也没反应过来,今天第一次搞gradle,突然就报错了,打印出。好了我就继续看项目了。

m0_59878789的博客 4090

使用torchvision的Resnet预训练模型并替换最后一个全连接FC层

使用torchvision的预训练模型,并替换最后一个全连接层

qq_36744580的博客 1655

隐藏技巧!用ArcGIS Pro像素编辑器实现PS级影像编辑(附地貌伪装案例)

本文深入探讨ArcGIS Pro像素编辑器的创意应用,从基础操作到高级影像处理实战,展示了其在城市规划、环境分析等领域的独特价值。通过详细的功能解析和地貌伪装等案例,帮助用户实现媲美专业图像处理软件的精细操作,提升GIS工作效率。

weixin_28520495的博客 335

torchvision加载ResNet除全连接层的权重

  简单贴下如何加载torchvision中预训练权重,要不总是忘。 import torch import torch.nn as nn import torchvision class ResNet(nn.Module): def __init__(self): super(ResNet, self).__init__() pass # 往ResNet里面添加权重 def init_weights(self, pretrained = True)

wulele2的博客 5936

汽车BMS技术分享及其HIL测试方案

在全球碳中和目标的战略驱动下,新能源汽车产业正以指数级速度重塑交通出行格局。动力电池作为电动汽车的"心脏",其性能与安全性不仅直接决定了车辆的续航里程、使用寿命等关键指标,更深刻影响着消费者对电动汽车的市场接受度。而电池管理系统(Battery Management System, BMS)是动力电池安全运行与性能释放的核心技术支撑。

Speedgoat的博客 2683

Halcon实战:5种边缘检测算子对比(Sobel、Roberts、Prewitt、Kirsch、Canny)

本文深入对比了Halcon中Sobel、Roberts、Prewitt、Kirsch和Canny五大边缘检测算子的实战表现与核心差异。通过工业图像实例与代码解析,提供了基于噪声水平、边缘连续性及实时性要求的场景化选型指南,帮助工程师精准选择最适合的算子以优化视觉检测流程。

weixin_29266007的博客 390

[Pytorch系列-43]:工具集 - torchvision预训练模型参数的导入(以ResNet为例)

作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_优快云博客 本文网址: 目录 第1章torchvision与预训练模型的自动下载 第2章 预训练模型的手工下载 第3章 网络介绍 第4章 前置条件:系统库的导入 第5章 预训练模型的导入 5.1 模型的创建 5.2 模型参数的导入 5.3 模型参数的应用 5.4模型的简单测试 第1章torchvision与预训练模型的自动下载 [Pytorch系列-37]:工具集 - torchvision库详解...

文火冰糖(王文兵)的博客 1万+

五分钟搞懂游戏开发中的抗锯齿算法

常见抗锯齿算法总结锯齿由来抗锯齿算法SSAAMSAACSAA 锯齿由来 场景的定义在三维空间中是连续的,而最终显示的像素则是一个离散的二维数组,这是计算机屏幕产生锯齿的原因。在计算机处理图形的过程中(渲染管线了解一下),有一个非常重要的阶段,就是光栅化,光栅化主要的作用是将顶点数据的不连续性通过插值计算,将两个顶点之间不存在的点进行弥补,然后实现到屏幕像素点上的一一映射。如图,现在要在屏幕上绘制一...

绿洲守望者 1万+

Pytorch学习第六讲:实现裁剪后的resnet50

先上一个pytorch里自带的一个版本 这个版本实现的比较简洁优雅,但如果你想自己改变一些参数,就比较难调,所以这篇文章,会基于该版本中最基本的一个bottleblock来做一个自己实现的版本,这个版本更方便修改参数,调试等。 import torch.nn as nn import torch.nn.functional as F import math import torch def c...

Vivianyzw的博客 2747

深入解析Android Qcom Camera HAL3架构与Camx线程模块

本文深入解析了Android Qcom Camera HAL3架构与Camx线程模块的核心原理。文章以高通芯片平台为例,剖析了从按下快门到生成照片的完整Camera流程分析,重点阐述了Camx框架中线程池、消息队列及Fence同步机制如何协同工作,以实现高效、稳定的多线程并发图像处理,为相机性能优化提供理论基础。

weixin_29184075的博客 220

智能驾驶辅助系统(ADAS)全解析:功能详解 + 技术原理 + 实战案例

智能驾驶辅助系统(ADAS)是现代汽车技术的重要组成部分,旨在提升驾驶安全性和便利性。本文详细解析了ADAS的多个功能模块,包括自适应巡航控制(ACC)、车道偏离预警/车道保持辅助(LDW/LKA)、前向碰撞预警/自动紧急制动(FCW/AEB)、盲区检测/变道辅助(BSD/BSM)、倒车影像、自动泊车辅助(APA)、交通标志识别(TSR)、自动远光控制(AHB)、后方交叉来车预警(RCTA)和驾驶员疲劳监测。每个功能模块都基于特定的技术原理,如毫米波雷达、摄像头、传感器融合和深度学习算法,以实现对车辆周围环

weixin_43199439的博客 2098

PyTorch 08: PyTorch实现迁移学习(densenet121,resnet,,alexnet等)

现在,我们来学习如何使用预训练的网络解决有挑战性的计算机视觉问题。你将使用通过 ImageNet 位于 torchvision 上训练的网络。 ImageNet 是一个庞大的数据集,包含 100 多万张有标签图像,并涉及 1000 个类别。.它可用于训练采用卷积层结构的深度神经网络。我不会详细讲解卷积网络,但是你可以观看此视频了解这种网络。 训练过后,作为特征检测器,这些模型可以在训练时未使用的图像上达到惊人的效果。对不在训练集中的图像使用预训练的网络称为迁移学习。我们将使用迁移学习训练网络分类猫狗照片并达

科学边界 9722

TC8:IPv4_HEADER_05-09

所有主机都必须准备好接受最多576个字节的数据报我们知道最大传输单元MTU通常是1500个字节,也就是说一条IP数据报的Header+payload最大1500,那为什么这条测试用例又要求主机准备好接受最多576个字节的IP数据报呢。

jasonj333 510

利用迁移学习实现食物分类:基于PyTorch与ResNet18的实战案例

迁移学习的核心思想是将在一个任务(源任务)中学习到的知识,应用到另一个相关任务(目标任务)中。在计算机视觉领域,许多预训练模型,如ResNet、VGG等,已经在大规模图像数据集(如ImageNet)上进行了充分训练,学习到了丰富的图像特征表示。这些预训练模型的底层网络结构能够提取通用的图像特征,如边缘、纹理等,而顶层网络结构则与源任务的类别紧密相关。因此,在目标任务中,我们可以保留预训练模型的底层结构,仅对顶层进行微调,使其适应目标任务的分类需求。

2201_75345884的博客 1196

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

深度学习入门:Pytorch实现Resnet训练CIFAR10数据集

深度学习入门:Pytorch实现Resnet训练CIFAR10数据集 【下载地址】Pytorch实现Resnet训练CIFAR10数据集完整代码可进一步优化分享 本资源文件提供了一个完整的Pytorch代码示例,用于训练ResNet模型在CIFAR10数据集上。代码实现了ResNet的基本结构,并展示了如何在CIFAR1...

gitblog_06510的博客 420

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

【深度学习】经典CNN模型梳理与Pytorch实现:LeNet、AlexNet、NiN、VGGNet、ResNet

1. 前言 经典永不过时。这篇文章中,我们要回顾卷积神经网络发展史上几个经典模型:LeNet、AlexNet、NiN、VGGNet、ResNet,梳理它们的发展脉络,总结它们各自的特点,并借助Pytorch完成实现。 2. 模型及实现 2.1 LeNet LeNet是LeCun在1998年提出的用于解决手写数字识别任务的卷积神经网络模型,这一网络模型奠定了之后CNN的基本架构。它又被称为LeNet-5,5表示第5代版本。LeNet-5的基本结构是:卷积、池化、卷积、池化、全连接。 LeNet.

DwD-的博客 1746

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

深度学习场景分类实战:从ResNet50模型选型到PyTorch完整实现

图像分类是计算机视觉的基础任务,其核心是让机器理解并识别图像内容。基于卷积神经网络(CNN)的深度学习技术,通过模拟生物视觉机制,自动从像素中学习层次化特征,实现了对复杂视觉模式的精准建模。这项技术的价值在于将海量图像数据转化为结构化信息,为自动化决策提供支持。在工程实践中,迁移学习成为高效解决方案,通过在ImageNet等大型数据集上预训练的模型进行微调,可快速适配特定任务。其应用场景广泛,涵盖智能相册自动归类、安防监控场景识别、自动驾驶环境感知以及社交媒体内容过滤等。本文聚焦于场景分类这一具体领域,深入

dieqiao8331的博客 373

迁移学习实战:PyTorch_Practice教你用ResNet18实现图像分类微调

迁移学习是深度学习领域的高效技术,尤其适合数据量有限的场景。PyTorch_Practice项目提供了基于ResNet18的图像分类微调完整实现,帮助开发者快速掌握迁移学习核心方法。本文将带你通过实际案例,学习如何利用预训练模型解决自定义图像分类问题。 ## 为什么选择迁移学习? 传统深度学习模型训练需要大量标注数据和计算资源,而迁移学习通过复用预训练模型的特征提取能力,只需少量数据即可实现高

gitblog_00868的博客 1144

【小白学习PyTorch教程】十四、迁移学习:微调ResNet实现男人和女人图像分类

我们使用迁移学习方法,只需要修改最后的输出即可。

微信号:RunsenLiu 2173

PyTorch迁移学习实战:用ResNet预训练模型实现小样本图像分类

在深度学习领域,迁移学习是一种重要的技术范式,其核心原理是利用在大规模数据集(如ImageNet)上预训练的模型所学习的通用特征表示,通过微调或特征提取的方式,快速适应到数据稀缺的新任务中。这项技术的核心价值在于显著降低了对目标领域标注数据量的需求,并大幅缩短了模型开发周期。在计算机视觉任务中,尤其是在图像分类场景下,当每个类别仅有几十到几百张样本时,迁移学习展现出了强大的实用价值。通过冻结预训练模型的部分层、替换分类头并结合数据增强等策略,可以有效防止小数据集上的过拟合问题。本文以PyTorch为框架,以

weixin_30512089的博客 373

大数据深度学习ResNet深度残差网络详解:网络结构解读与PyTorch实现教程

深度残差网络(Deep Residual Networks,简称ResNet)自从2015年首次提出以来,就在深度学习领域产生了深远影响。通过一种创新的“残差学习”机制,ResNet成功地训练了比以往模型更深的神经网络,从而显著提高了多个任务的性能。深度残差网络通过引入残差学习和特殊的网络结构,解决了传统深度神经网络中的梯度消失问题,并实现了高效、可扩展的深层模型。梯度消失问题发生在神经网络的反向传播过程中,具体表现为网络中某些权重的梯度接近或变为零。这导致这些权重几乎不会更新,从而阻碍了网络的训练。

专注 AI、大数据、Python、爬虫、数据分析可视化、机器学习、推荐算法、知识图谱、大模型应用与全栈系统开发,长期沉淀真实项目案例、源码解析、系统设计、部署经验与工程化实践,分享可运行、可复用、可落地的技术方案。 5495
上一篇: cpp实现Python里面的for index,value in enumerate():的操作
下一篇: resnet.children()的输出
dlvector
博客等级 码龄10年 85粉丝 142原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值