7.6 残差网络

随着我们设计越来越深网络深刻理解 添加如何提升神经网络性能变得至关重要。更重要设计网络能力在这种网络添加使网络更具有表达为了取得突破需要一些数学基础

7.6.1 函数

假设有一类特定神经网络架构F包括学习率其他参数设置对于所有f属于F存在一些参数这些参数可以通过合适数据集上进行训练获得现在假设f我们真正想找到函数如果f属于F那么可以轻而易举通过网络得到通常不会那么幸运我们尝试找到一个函数f这是F最佳选择例如给定一个具有X特性y标签数据集我们可以尝试通过解决以下优化问题找到

F = argminL(X,y,f)

怎样得到更接近真正f函数唯一合理可能是我们需要设计一个更强架构F换句话说我们预计fF接近然而如果F则无法保证新的体系接近事实f 可能更糟如图7-7所示对于嵌套函数较为复杂函数并不总函数f靠拢7x7左侧虽然F3F

接近f函数但是F6离得更远了对于7-7右侧嵌套函数F1 <= F6, 我们可以避免上述问题

7-7 对于嵌套函数 较为复杂函数不能保证更接近函数f这种现象嵌套函数会发生

因此只有较复杂函数包含较小函数我们才能确保提高他们性能对于深度神经网络如果我们 能将新添加训练成恒等函数f(x) = x模型源模型同样有效,同时由于模型可能更优拟合训练数据集因此添加层四户更容易见效训练误差

针对这个问题提出了残差网络ResNet2015ImageNet 图像识别挑战赛夺魁并深刻影响了后来深度神经网络设计残差网络核心思想每个附加层都应该容易包含原始函数作为元素之一残差块便诞生这个设计对于如何建立深度神经网络影响ResNet赢得了2015ImageNet大规模视觉识别挑战赛

7.6.2 残差块

聚焦于神经网络局部如图7-8所示假设原始输入x希望学习理想映射f(x) 7-8作图虚线部分需要直接拟合映射f(x)右图虚线部分需要拟合残差映射f(x)我们只需要7-8虚线上方运算权重偏置参数设置0那么f(x)恒等函数世纪钟理想映射f(x) 基础架构--残差块残差块输入通过跨层数据通路更快向前传播

激活函数f(x) 权重 激活函数 权重层

激活函数 f(x) f(x) 权重 激活函数 权重层

7-8 一个正常一个残差块

ResNet沿用了VGG完整3x3卷积层设计残差块首先2相同输出通道数3x3卷积层每个卷积层一个批量规范化ReLU激活函数我们通过数据通道跳过2卷积运算输入直接最后ReLU激活函数这样设计要求2卷积层输出输入形状相同从而使得他们可以相加如果想要改变通道数需要引入一个额外1x1卷积层输入变换所需要形状后运算残差块实现如下

import pytorch

from torch import nn

from torch.nn import functional as F

from d2l import torch as d2l

class Residual(nn.Module):

def __init__(self, input_channels, num_channels,

use_1x1conv = False, strides=1):

super().__init()__()

self.conv1 = nn.Conv2d(input_channels, num_channels, kernel_size=3, padding=1, stride = strides)

self.conv2 = nn.Conv2d(num_channels, num_channels, kernel_size=3, padding=1)

if use_1x1conv:

self.conv3 = nn.Conv2d(input_channels, num_channels, kernel_size=1, stride=strides)

else

self.conv3 = None

self.bn1 = nn.BatchNorm2d(num_channels)

self.bn2 = nn.BatchNorm2d(num_channels)

def forward(self, X):

Y = F.relu(self.bn1(self.conv1(X)))

Y=self.bn2(self.conv2(Y))

if self.conv3:

X = self.conv3(x)

Y += X

return F.relu(Y)

r如图7-9所示执行此代码生成两种类型网络一种use_1x1conv=False应用ReLU线性函数之前输入添加到输出另一种use_1x1conv = True通过添加1x1卷积层调整通道分辨率

RELU

批量规范化

3x3卷积层

ReLU

批量规范化

3x3卷积层

x

RELU

批量规范化

3x3卷积层

RELU

批量规范化

3x3卷积层

1x1卷积层

下面我们查看输入和输出形状一致情况

blk = Residual(3,3)

X=torch.rand(4,3,6,6)

Y = blk(X)

  1. shape
  2. torch.size[4,3,6,6]
  3. 我们也可以增加输出通道数同时减半输出高度宽度
  4. blk=Residual(3,6,use_1x1conv=True,strides=2)
  5. blk(X).shape
  6. torch.size([4,6,3,3])
  7. 7.6.3 ResNet模型

ResNet两层之前介绍GoogleNet一样输出通道数64步骤27x7卷积步骤23x3最大汇聚层不同之处在于ResNet每个卷积层增加批量规范化

b1 = nn.Sequential(nn.Conv2d(1,64,kernel_size=7,stride=2,apdding=3),

nn.BatchNorm2d(64), nn.ReLU(),

nn.MaxPool2d(kernel_size=3, stride=2, padding=1))

GoogleNet在后面接了4Inception组成模块ResNet使用4残差组成模块每个模块使用若干输出通道数相同残差块第一个模块通道数输入通道数一致由于之前已经使用了步骤2最大汇聚层因此无须减少高度宽度之后每个模块第一个残差块上一个模块通道数翻倍高度宽度减半

下面我们实现这个模块注意我们对第一个模块做了特别处理

def resnet_block(input_channels, num_channels, num_residuals, first_block=False):

bllk=[]

for i in range(num_residuals):

if i == 0 and not first block:

blk.append(Residual(input_channels, num_channels, use_1x1conv=True, strides=2))

else

blk.append(num_channels, num_channels)

return blk

接着ResNet加入所有残差块这里每个模块使用2残差块

b2 = nn.Sequential(*resnet_block(64,64,2,first_block=True))

b3 = nn.Sequential(*resnet_block(64,128,2))

b4 = nn.Sequential(*resnet_block(128,256,2))

b5 = nn.Sequential(*resnet_block(256,512,2))

最后GoogleNet一样ResNet加入全局平均汇聚层以及全连接输出

net = nn.Sequential(b1,b2,b3,b4,b5,

nn.AdaptivePool2d(1,1),

nn.Flatten(),nn.Linear(512,10))

每个模块4卷积层加上第一个7x7卷积层最后一个全连接层18

因此这种模型通常被称为ResNet-18. 通过配置不同通道数模块里面残差块可以得到不同ResNet模型例如更深152ResNet-152虽然ResNet主题架构GooGLeNet类似但是ResNet架构简单修改更方便ResNet广泛使用7-10展示完整ResNet-18架构

训练ResNet之前我们观察一个ResNet不同模块输入形状如何变化在之前所有架构分辨率降低通道数增加直到全局平均汇聚层聚合所有特征

X=torch.rand(size=(1,1,224,224))

for layer in net:

X = layer(X)

Sequential output shape: torch.Size(1,64,56,56)

Sequential output shape: torch.Size(1,64,56,56)

AdaptiveAvgPool2d output shape

Flatten output shape

Linear output shape

7.6.4 训练模型

同之前一样我们Fashion-MNIST数据集上训练ResNet

lr, num_epochs, batch_size=0.05, 10. 256

train_iter, test_iter=d2l.load_data_fashion_mnist(batch_szie, resize=96)

d2l.train_ch6(net, train_iter, test_iter, num_epochs, lr, d2l.try_gpu())

小结

学习嵌套函数训练神经网络理想情况在深度神经网络中, 学习另一层作为恒等函数较为容易

残差映射可以更容易学习同一函数例如使权重参数接近

利用残差可以训练一个有效深度神经网络输入可以通过残余连接更快向前传播

残差网络ResNet 其后深度神经网络设计产生深远影响

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/96722.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/96722.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

建模工具Sparx EA的多视图协作教程

在传统建模工具中&#xff0c;功能繁杂、界面混乱、窗口频繁切换等问题长期困扰着架构师与开发人员&#xff0c;不仅拖慢设计节奏&#xff0c;更导致模型与文档严重脱节。企业架构与建模平台Sparx EA直面这些挑战&#xff0c;通过现代化的Ribbon界面与多视图协作机制&#xff0…

从聚类到集成,两种实用算法框架分享

一、K-means&#xff1a;让数据自己 “找组织”什么是聚类&#xff1f;聚类属于无监督学习的范畴 —— 简单说就是手里没有标签时&#xff0c;我们要把长得像的样本分到一组。比如给一堆用户数据&#xff0c;不需要提前知道 “高价值用户”“潜在用户” 这些标签&#xff0c;聚…

Elasticsearch:什么是神经网络?

神经网络定义 神经网络&#xff08;Neural networks&#xff09;是机器学习&#xff08;machine learning&#xff09;的一个子集&#xff0c;旨在模拟生物大脑的结构和功能。也称为人工神经网络 (artificial neural networks - ANNs)&#xff0c;神经网络由互连的节点或人工神…

XTDrone——无人机基于2D激光Lidar进行二维运动规划(细节提醒以及相关报错解决)

参考XTDrone文档&#xff1a; 二维激光SLAM&#xff08;HectorSLAM&#xff09; 语雀 二维运动规划 语雀 相关ROS依赖库&#xff1a; 本地基于的是20.04的ubuntu系统&#xff1a; sudo apt install -y ros-noetic-move-base \ ros-noetic-costmap-2d \ ros-noetic-dwa-l…

机器学习算法-朴素贝叶斯

朴素贝叶斯分类器就是根据贝叶斯公式计算结果进行分类的模型&#xff0c;“朴素”指事件之间相互独立无影响. 例 如&#xff1a;有如下数据集&#xff1a;Text CategoryA great game&#xff08;一个伟大的比赛&#xff09;Sports&#xff08;体育运动&#xff09;The e…

RoPE, 2D RoPE, 3D RoPE和复数

旋转位置编码是一种用于Transformer架构中的位置编码方法&#xff0c;从复数的角度来看&#xff0c;其主要利用了复数的乘法性质来实现位置编码&#xff0c;以下作为学习记录&#xff1a;1. 旋转位置编码1&#xff09;对于输入序列的每个位置的嵌入向量&#xff0c;将嵌入向量分…

Java静态代理与动态代理实战解析

Java静态代理 示例代码 接口&#xff1a; package com.ssg.aop.interfaces;public interface MathCalculator { // 加法public int add(int a, int b); }接口实现类&#xff1a; package com.ssg.aop.impl; import com.ssg.aop.interfaces.MathCalculator;public class Math…

如何排查服务器DNS解析失败的问题

服务器 DNS 解析失败会导致无法访问域名&#xff08;如 google.com&#xff09;&#xff0c;可能影响服务器的正常运行。以下是排查 DNS 解析失败问题的详细步骤&#xff0c;包括可能的原因、诊断方法和解决方案。1. 原因分析DNS 解析失败通常由以下原因引起&#xff1a;DNS 配…

音视频面试题集锦第 32 期

音视频学习群&#xff1a;https://gjzkeyframe.github.io/posts/wechat-group/ 音视频面试题集锦第 32 期&#xff1a; 1、请详细解释 H.264 编码中的熵编码方式&#xff08;CAVLC 和 CABAC&#xff09;&#xff0c;它们的区别和适用场景是什么&#xff1f;2、解释 H.264/H.2…

最大矩形+单调栈

题目&#xff1a;思考1&#xff1a; 利用柱形图最大矩形的思想对于矩阵的每一行看作是柱形图的地基对每一行&#xff08;认定为柱形图&#xff09;执行找最大矩形 实现&#xff1a; class Solution { public:int maximalRectangle(vector<vector<char>>& matri…

NewsNow搭建喂饭级教程

大家在自媒体写文章里遇到最难的问题便是查找题材了&#xff0c;随便选择的题材没多少人会去看&#xff0c;平台也不会给流量推送&#xff0c;所以&#xff0c;只有围绕热门题材去进行文章创作&#xff0c;才能得到平台的重点推送以及大家的关注&#xff01; 在做这个功能前&a…

大疆无人机平台 资源开放

一、部署包说明 目前基于大疆上云api开发的平台经过多轮测试&#xff0c;已经有了个稳定的版本&#xff0c;并且有山东滨州、陕西西安、河南郑州、上海、广东深圳、广东广州、宁夏以及安徽等各地的用户使用在公路巡检、森林防火、电力巡查等行业中。 下面将会先将部署包免费开…

恶劣天气下漏检率↓79%!陌讯多模态时序融合算法在道路事故识别的实战优化

原创声明 本文为原创技术解析文章&#xff0c;核心技术参数与架构设计引用自 “陌讯技术白皮书&#xff08;道路事故识别专项版&#xff09;”&#xff0c;禁止任何形式的抄袭与转载。文中代码示例、性能数据均来自实测验证&#xff0c;技术描述已完成差异化重写&#xff0c;不…

visual studio编译的软件查找所依赖的运行库方法

使用visual studio编译生成的exe软件&#xff0c;在单独运行的时候&#xff0c;总是会提示vs运行库找不到&#xff0c;比如vcruntime140.dll&#xff0c;msvcp140d.dll等找不到&#xff0c;此时如果在开发电脑中查找&#xff0c;会找出一堆各种版本的同名字动态库来&#xff0c…

ARINC 825板卡的应用

ARINC概览AEEC&#xff08;航空电子工程委员会&#xff09;是SAE ITC&#xff08;SAE行业技术联盟&#xff09;的下属机构之一&#xff0c;旨在为航空业制定标准。SAE ITC下设多个委员会和分委员会&#xff0c;各委员会设工作组负责制定航空电子设备和系统的各种标准。其中&…

试析微剧《云端爱人》:AI时代的数字爱情寓言与情感觉醒

《云端爱人》作为一部聚焦人工智能与人类情感关系的短剧&#xff0c;其文本价值远超普通都市爱情题材&#xff0c;可视为数字化时代的情感寓言。以下从社会镜像、叙事张力、哲学思辨三个维度展开深度解析&#xff1a;一、「赛博恋爱」的社会预演&#xff1a;当代人的情感代偿机…

多线程下单例如何保证

系列文章目录 文章目录系列文章目录一、方法1、懒汉式双重检查锁2、饿汉式静态初始化3、使用静态内部类&#xff08;懒汉式的一种变体&#xff09;4、使用 AtomicReference5、使用依赖注入框架&#xff0c;Spring一、方法 懒汉式&#xff1a;延迟加载&#xff0c;第一次调用get…

Java的数字计算

目录 一、基本数据类型 二、包装类 三、精确计算&#xff1a;BigDecimal 四、大整数&#xff1a;BigInteger 五、实际应用示例&#xff1a;RSA 加密算法核心计算 一、基本数据类型 这是进行数字计算最高效的方式&#xff0c;直接在栈上分配内存。它们分为整数型和浮点型。…

手写MyBatis第32弹-设计模式实战:Builder模式在MyBatis框架中的精妙应用

&#x1f942;(❁◡❁)您的点赞&#x1f44d;➕评论&#x1f4dd;➕收藏⭐是作者创作的最大动力&#x1f91e;&#x1f496;&#x1f4d5;&#x1f389;&#x1f525; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4dd;欢迎留言讨论&#x1f525;&#x1f525;&am…

小白成长之路-k8s原理(一)

文章目录前言一、k8s组件1.1master部分1.2node节点二、网络2.1网络模型2.2CNI2.3流程2.4网络解决方案2.5网络模式三、资源清单3.1概述3.2常见的资源3.3资源清单的编写四、Pod4.1概念图4.2pause4.3概述4.4pod生命周期4.5pod探针4.6钩子4.7pod控制器1.RC 控制器2.RS控制器3.deplo…