卷积神经网络——下篇【深度学习】【PyTorch】【d2l】

news2024/11/23 10:57:57

文章目录

  • 5、卷积神经网络
    • 5.10、⭐批量归一化
      • 5.10.1、理论部分
      • 5.10.2、代码部分
    • 5.11、⭐残差网络(`ResNet`)
      • 5.11.1、理论部分
      • 5.11.2、代码部分
  • 话题闲谈

5、卷积神经网络

5.10、⭐批量归一化

5.10.1、理论部分

批量归一化可以解决深层网络中梯度消失和收敛慢的问题,通过固定每个批次的均值和方差来加速收敛,一般不改变模型精度。批量规范化已经被证明是一种不可或缺的方法,它适用于几乎所有图像分类器。

批量规划是一个线性变换,把参数的均值方差给拉的比较好。让你变化不那么剧烈。

批量规范化应用于单个可选层(也可以应用到所有层),其原理如下:在每次训练迭代中,我们首先规范化输入,即通过减去其均值并除以其标准差,其中两者均基于当前小批量处理。 接下来,我们应用比例系数和比例偏移。 正是由于这个基于批量统计的标准化,才有了批量规范化的名称。

B N ( x ) = γ ⊚ x − μ ^ B σ ^ B β BN(x) = γ⊚\frac{x-\hat{μ}_B}{\hat{σ}_B}β BN(x)=γσ^Bxμ^Bβ

其中,x∈B,x是一个小批量B的输入,比例系数γ,比例偏移β。 μ ^ β B \hat{μ}β_B μ^βB小批量B的均值, σ ^ B \hat{σ}_B σ^B小批量B的标准差。

μ ^ B = 1 ∣ B ∣ ∑ x ∈ B x \hat{μ}_B = \frac{1}{|B|}\sum_{x∈B}{x} μ^B=B1xBx

σ ^ B 2 = 1 ∣ B ∣ ∑ x ∈ B ( x − μ ^ β B ) 2 + c {\hat{σ}_B}^2 = \frac{1}{|B|}\sum_{x∈B}{(x-\hat{μ}β_B)^2 + c} σ^B2=B1xB(xμ^βB)2+c

差估计值中添加一个小的常量c>0,以确保永远不会尝试除以零【BN(x)分母】。通过使用平均值和方差的噪声(noise)估计来抵消缩放问题,噪声这里是有益的。

  • 可学习的参数:比例系数γ,比例偏移β;

  • 作用在全连接层和卷积层输出,激活函数前;

  • 作用在全连接层和卷积层输入。

    作用于全连接层的特征维

    作用于卷积层的通道维

5.10.2、代码部分

直接使用深度学习框架中定义的BatchNorm定义Sequential

import torch
from torch import nn
from d2l import torch as d2l


net = nn.Sequential(
    nn.Conv2d(1, 6, kernel_size=5), nn.BatchNorm2d(6), nn.Sigmoid(),
    nn.AvgPool2d(kernel_size=2, stride=2),
    nn.Conv2d(6, 16, kernel_size=5), nn.BatchNorm2d(16), nn.Sigmoid(),
    nn.AvgPool2d(kernel_size=2, stride=2), nn.Flatten(),
    nn.Linear(256, 120), nn.BatchNorm1d(120), nn.Sigmoid(),
    nn.Linear(120, 84), nn.BatchNorm1d(84), nn.Sigmoid(),
    nn.Linear(84, 10))
lr, num_epochs, batch_size = 1.0, 10, 256
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)
d2l.train_ch6(net, train_iter, test_iter, num_epochs, lr, d2l.try_gpu())

在这里插入图片描述

批量规范化应用于LeNet

net = nn.Sequential(
    nn.Conv2d(1, 6, kernel_size=5), BatchNorm(6, num_dims=4), nn.Sigmoid(),
    nn.AvgPool2d(kernel_size=2, stride=2),
    nn.Conv2d(6, 16, kernel_size=5), BatchNorm(16, num_dims=4), nn.Sigmoid(),
    nn.AvgPool2d(kernel_size=2, stride=2), nn.Flatten(),
    nn.Linear(16*4*4, 120), BatchNorm(120, num_dims=2), nn.Sigmoid(),
    nn.Linear(120, 84), BatchNorm(84, num_dims=2), nn.Sigmoid(),
    nn.Linear(84, 10))

5.11、⭐残差网络(ResNet

5.11.1、理论部分

核心思想:保证加更多的层效果较之前不会变差。

设计越来越深的网络,网络表现不一定会更好。

实现原理-残差块(residual blocks


每个附加层都应该更容易地包含原始函数作为其元素之一。

如下图:

正常块中,输出直接作为理想映射 f ( x ) f(x) f(x)

残差块中,输出为 f ( x ) − x f(x)-x f(x)x x x x两部分

x经过残差映射 f ( x ) − x f(x)-x f(x)x输出

x作为原始数据恒等映射到输出

两者共同组成 f ( x ) f(x) f(x)

在这里插入图片描述

5.11.2、代码部分

实现残差块

import torch
from torch import nn
from torch.nn import functional as F
from d2l import torch as d2l


class Residual(nn.Module):  #@save
    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)

生成两种类型的网络:

在这里插入图片描述

验证输入输出情况一致

blk = Residual(3,3)
X = torch.rand(4, 3, 6, 6)
Y = blk(X)
Y.shape
torch.Size([4, 3, 6, 6])

验证增加输出通道数,同时减半输出的高和宽

blk = Residual(3,6, use_1x1conv=True, strides=2)
blk(X).shape
torch.Size([4, 6, 3, 3])

定义ResNet第一个Sequential

b1 = nn.Sequential(nn.Conv2d(1, 64, kernel_size=7, stride=2, padding=3),
                   nn.BatchNorm2d(64), nn.ReLU(),
                   nn.MaxPool2d(kernel_size=3, stride=2, padding=1))

定义残差块

def resnet_block(input_channels, num_channels, num_residuals,
                 first_block=False):
    blk = []
    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(Residual(num_channels, num_channels))
    return blk

定义其他(含残差块)Sequential

每个模块使用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))

ResNet中加入全局平均汇聚层,以及全连接层输出

每个模块【b2-b5】有4个卷积层(不包括恒等映射的1×1卷积层)。 加上第一个7×7卷积层和最后一个全连接层,共有18层。 因此,这种模型通常被称为ResNet-18

在这里插入图片描述

net = nn.Sequential(b1, b2, b3, b4, b5,
                    nn.AdaptiveAvgPool2d((1,1)),
                    nn.Flatten(), nn.Linear(512, 10))

验证每模块输出形状变化

X = torch.rand(size=(1, 1, 224, 224))
for layer in net:
    X = layer(X)
    print(layer.__class__.__name__,'output shape:\t', X.shape)
Sequential output shape:	 torch.Size([1, 64, 56, 56])
Sequential output shape:	 torch.Size([1, 64, 56, 56])
Sequential output shape:	 torch.Size([1, 128, 28, 28])
Sequential output shape:	 torch.Size([1, 256, 14, 14])
Sequential output shape:	 torch.Size([1, 512, 7, 7])
AdaptiveAvgPool2d output shape:	 torch.Size([1, 512, 1, 1])
Flatten output shape:	 torch.Size([1, 512])
Linear output shape:	 torch.Size([1, 10])

训练模型

lr, num_epochs, batch_size = 0.05, 10, 256
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size, resize=96)
d2l.train_ch6(net, train_iter, test_iter, num_epochs, lr, d2l.try_gpu())

在这里插入图片描述

话题闲谈

怎么维护自己的电脑?
对于深度学习工作者而言,电脑是最为重要的工作工具之一,因此维护电脑的健康状态对工作、学习和生活都至关重要。


首先,定期进行系统和软件的更新,保持操作系统和应用程序在最新版本,以获得更好的性能和安全性。其次,保持电脑的清洁,定期清理灰尘和污垢,确保散热良好,避免过热对硬件的损害。此外,备份重要数据是必不可少的,以防止意外数据丢失。
在学习方面,合理规划学习时间,避免长时间的连续使用电脑,适时休息,保护眼睛和身体健康。
生活娱乐方面,多参与户外活动,保持身体锻炼,减轻长时间坐在电脑前带来的压力。总之,深度学习工作者应关注电脑的硬件和软件健康,平衡工作、学习和生活,保持身心健康。

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

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

相关文章

需求自动拆解子需求功能上线!自动估算再升级!

CoCode开发云旗下Co-Project V3.5智能项目管理平台正式发布,平台需求板块、估算板块以及需求分析工具全新升级:需求自动拆解为子需求,自动估算功能优化,需求分析工具界面优化。 需求自动拆解为多个子需求,有助于需求细…

2023.8 - java - String类

字符串广泛应用 在 Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串。 String str "Runoob"; 在代码中遇到字符串常量时,这里的值是 "Runoob",编译器会使用该值创建一个 S…

Hbase分布式安装

一、环境准备 启动zookeeper 启动hdfs 二、安装 上传安装包 1、解压 tar -zxf hbase-2.2.2-bin.tar.gz -C /opt/installs/2、更名 mv hbase-2.2.2/ hbase3、配置环境变量 [roothadoop11 conf]# vim /etc/profile export HBASE_HOME/opt/installs/hbase export PATH$PATH:$…

python操作elasticsearch

python操作elasticsearch_一个高效工作的家伙的博客-CSDN博客 待更新

5.物联网LWIP之Socket编程优化与实现(补充4)

UDP编程模型 1.UDP C/S模型 2.UDP API socket int socket(int domain, int type, int protocol); domain: AF_INET 这是大多数用来产生socket的协议,使用TCP或UDP来传输,用IPv4的地址 AF_INET6 与上面类似,不过是来用IPv6的地址 …

开学什么电容笔便宜又好用?ipad可以用的手写笔

如今,随着人们生活的智能化,一些人已经把传统的手提电脑换成了平板电脑。无论是用iPad画图,还是用来写笔记,我觉得它都很方便,但苹果的Pencil却很贵,很多人买不起。根据我对电容笔的深刻理解,如…

Java 注解计算12生肖,java Data中获取年,根据生日日期获取生肖注解,根据输入时间获取生肖,自定义注解的方式获取生肖 根据年份时间获取十二生肖

最近,开发中需要增加生肖,但是不想增加字段,于是通过注解的方式,实现生日与生肖的转换。 话不多说,直接上代码,如下: 实体类中的字段,添加自定义注解(ToChineseZodiacSe…

Echarts面积图2.0(范围绘制)

代码: // 以下代码可以直接粘贴在echarts官网的示例上 // 范围值 let normalValue {type: 内部绘制,minValue: 200,maxValue: 750 } // 原本的绘图数据 let seriesData [820, 932, 901, 934, 1290, 1330, 1320] let minData Array.from({length: seriesData.len…

Android创建签名文件,并获取签名文件MD5,SHA1,SHA256值

一、创建Android签名文件 使用Android Studio开发工具,可视化窗口进行创建 第一步:点击AndroidStudio导航栏上的 Build→Generate Signed Bundle / APK 第二步:选择APK选项 第三步:创建签名文件 第四步:输入创建签名的…

数字化系统如何让企业增收?数字化转型如何做到“业务为先”?

很多时候企业往往觉得自己一定要用更高端、更先进的系统才算是完成了数字化转型,但事实是这样的数字化转型往往伴随着大量时间、精力甚至是财力的投入,还一点收益都见不到。对于大部分企业来说,数字化转型是一个持久战,因此&#…

STL---list

目录 1. list的介绍及使用 1.1 list的介绍 1.2 list的使用注意事项 2.list接口介绍及模拟实现 2.1构造​编辑 2.2容量 2.3修改 3.list迭代器 4.迭代器失效 5.模拟实现 6.vector和list的区别 1. list的介绍及使用 1.1 list的介绍 list的文档介绍 1. list是可以在常…

第十四课:采用 Qt 开发翻页/分页/多页窗体组件

功能描述:采用 Qt 开发一个翻页/分页/多页的窗体组件,封装为 QWidget 的子类,在你的应用程序中可直接使用。 一、最终演示效果 本次制作的翻页/分页/多页窗体组件是基于 Qt 开发,整个程序封装成 PageWidget 类,继承于…

Mac桌面小部件:Widgetter

Widgetter是一个基于Python的Web应用程序,用于创建和管理小部件的在线平台。该平台可以让用户轻松地创建和定制各种小部件,包括时钟、计算器、天气预报、地图等等。Widgetter还提供了一套易于使用的工具和界面,供用户进行小部件的编辑和布局。…

vue3 基础知识 (组件之间的通信 and vuex) 02

侬好哇 !😍 文章目录 一、组件的通信 (父传子)二、非 Prop 的Attribute (属性)三、组件的通信 (子传父)四、非父子组件的相互通信(Provide/Inject)五、非父子组件的相互通…

FPGA使用MIG调用SODIMM内存条接口教程,提供vivado工程源码和技术支持

目录 1、前言免责声明 2、SODIMM内存条简介3、设计思路框架视频输入视频缓存MIG配置调用SODIMM内存条VGA时序视频输出 4、vivado工程详解5、上板调试验证6、福利:工程代码的获取 1、前言 FPGA应用中,数据缓存是一大重点,不管是图像处理还是A…

蓝牙防丢器(附HS6621芯片选型)

在繁忙的生活中,我们往往会因为疏忽而丢失贵重物品,如钱包、钥匙、手机等,给生活带来不小的麻烦。然而,现代科技正为我们提供一种聪明的解决方案——蓝牙防丢器。这款小巧智能的装置不仅保护您的财物,还为您的生活带来…

无涯教程-PHP - sql_regcase()函数

sql_regcase() - 语法 string sql_regcase (string string) 可以将sql_regcase()函数视为实用程序函数,它将输入参数字符串中的每个字符转换为包含两个字符的带括号的表达式。 sql_regcase() - 返回值 返回带括号的表达式字符串以及转换后的字符。 sql_regcase…

隧道vs免费爬虫ip:为何要选择隧道爬虫ip?

在网络爬虫的世界中,爬虫ip是一项关键技术,它可以帮助我们隐藏身份、突破限制、提高抓取效率。但是,在选择爬虫ip时,我们常常会面对隧道爬虫ip和免费爬虫ip之间的抉择。在本文中,我们将探讨隧道爬虫ip相对于免费爬虫ip…

再谈一下DDD中的聚合设计

何为聚合 在领域模型中,一些实体或者值对象具有强而有力的业务关联关系,于是这些对象就组成了一个聚合,聚合内部的业务实体之间必须保证状态一致性。从技术角度来看,聚合是数据修改与持久化的基本单元,聚合内数据修改…

docker实践作业

1.安装docker服务,配置镜像加速器 2.下载系统镜像(Ubuntu、 centos) 3.基于下载的镜像创建两个容器 (容器名一个为自己名字全拼,一个为首名字字母) 4.容器的启动、 停止及重启操作 5.怎么查看正在运行的容器…