当前位置: 首页 > news >正文

记录学习《手动学习深度学习》这本书的笔记(三)

这两天看完了第六章:卷积神经网络,巧的是最近上的专业选修课刚讲完卷积神经网络,什么卷积层池化层听得云里雾里的,这一章正好帮我讲解了基础的知识。

第六章:卷积神经网络

6.1 从全连接层到卷积

在之前的学习中,我们主要学习的是全连接层,在处理二维图像中的做法是将图像平展为一维数组,但这样显然没有考虑到图像的空间性,而卷积,就是将图像相近像素之间互相关性提取出来,让机器能够从图像中学习到更多有效信息的重要模型。

在之前学到的多层感知机可以有效处理表格数据,但对于高维数据,多层感知机存在许多限制,比如,缺乏平移不变性和局部性。

修改全连接层,将全连接层的权重W改为具有平移不变性(对无论哪个位置的输入,都采取同样操作)。

全连接层
全连接操作

然后我们就可以得到卷积操作。

卷积操作

接着再改写一下形式,对图像的处理还需要局部性,即获取某个位置的信息,我们不能让偏移到离这个位置很远的地方去。

改写后的卷积操作

这就是卷积层的基本形式,就像是对二维图像每个一定区域内的数值执行固定权重的全连接一样,满足了平移不变性和局部性。

其中V叫做卷积核或滤波器。

其实这不是严格意义的数学里的卷积,但是非常类似,所以用了这个名字。

卷积也可有多通道,即对相同数据使用不同参数的卷积层,有的用于识别边缘,有的用于识别纹理,或者比如用卷积处理图像的时候,图像的颜色通常包含三原色,这时可以用三通道卷积层分别提取三种颜色特征。

卷积通常比全连接参数少,但依旧获得高效用。

6.2 图像卷积

这里举了一个简单的例子,实现了简单的卷积:

X:

array([[1., 1., 0., 0., 0., 0., 1., 1.],[1., 1., 0., 0., 0., 0., 1., 1.],[1., 1., 0., 0., 0., 0., 1., 1.],[1., 1., 0., 0., 0., 0., 1., 1.],[1., 1., 0., 0., 0., 0., 1., 1.],[1., 1., 0., 0., 0., 0., 1., 1.]])

比如提取这个“图像”的边缘,我们就可以用到卷积,将这个数组进行K=torch.tensor([[1.0, -1.0]])的卷积,进行卷积运算后得到:

Y:

array([[ 0.,  1.,  0.,  0.,  0., -1.,  0.],[ 0.,  1.,  0.,  0.,  0., -1.,  0.],[ 0.,  1.,  0.,  0.,  0., -1.,  0.],[ 0.,  1.,  0.,  0.,  0., -1.,  0.],[ 0.,  1.,  0.,  0.,  0., -1.,  0.],[ 0.,  1.,  0.,  0.,  0., -1.,  0.]])

但在实际中我们不可能每一个都人工设计卷积,所以要使用进行训练的方法。

conv2d = nn.Conv2d(1, 1, kernel_size = (1, 2), bias = False)X = X.reshape((1, 1, 6, 8))
Y = Y.reshape((1, 1, 6, 7))
lr = 3e-2for i in range(10):Y_hat = conv2d(X)l = (Y_hat - Y)**2conv2d.zero_grad()l.sum().backward()conv2d.weight.data[:] -= lr * conv2d.weight.gradprint(f'epoch {i+1}, loss {l.sum():.3f}')

这时输出conv2d.weight.data.reshape(1, 2),结果为:

tensor([[ 1.0010, -0.9739]])

与手动设计的卷积核非常相近。

最后介绍了特征映射和感受野两个概念,特征映射是指如上面例子所示输出的卷积层,因为它可以被视为一个输入映射到下一空间维度的转换器,感受野是指最初的输入中用于计算的所有元素(可能比输入元素多)。

6.3 填充与步幅

填充是为了解决进行卷积中常常丢失边缘特征而提出的,将输入数组的外围增添一层或多层0元素,可以有效解决丢失边缘像素的问题。

步幅的引用是为了高效滑动数组,步幅决定计算卷积时每次向左向下平移多少距离。

可以通过这样实现:

conv2d = nn.Conv2d(1, 1, kernel_size = (3, 5), padding = (0, 1), stride = (3, 4))

这里的参数分别为输入通道、输出通道、卷积核形状、填充大小、步幅大小。

6.4 多输入多输出通道

上面说了卷积也可有多通道,多通道输入例子:

将输入的不同通道用不同卷积核进行卷积运算,最后再将两个结果相加。

多通道输出就是将同一输入按不同卷积核进行运算,最后得到两个不同结果。

还有一个经常使用到的1×1卷积,虽然它失去了很多卷积的特点,更像一个全连接层,但它可以用于特征降维、调整网络层通道数量、控制模型复杂性。

6.5 汇聚层(池化层)

提起卷积神经网络经常会出现池化层这个概念,以前一直都不明白这是什么东西,今天算是明白了。

分为最大汇聚和平均汇聚,池化层是没有参数这些东西的,它就是简单的计算输入数据在某一区域的最大值或平均值。

它的主要作用是减弱卷积层对位置的过度敏感。

一个池化层的代码:

def pool2d(X, pool_size, mode):p_h, p_w = pool_sizeY = torch.zeros(X.shape[0] - p_h +1, X.shape[0] - p_w +1)for i in range(Y.shape[0]):for j in range(Y.shape[1]):if mode == 'max':Y[i, j] = X[i: i + p_h, j: j + p_w].max()elif mode == 'avg':Y[i: j] = X[i: i + p_h, j: j + p_w].mean() return Y

执行

pool2d(X, (2, 2), 'avg')

就可以得到X经过平均汇聚层的输出。

和卷积层一样,池化层也可以设置填充和步幅:

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

同样也可有多个通道,不过池化层的输入通道数和输出通道数是相同的。

6.6 卷积神经网络(LeNet)

用卷积层代替全连接层的一个好处就是:可以在图像中保留空间结构,并且使模型更简洁,所需参数更少。

LeNet是最早发明的卷积神经网络之一。

它由以下两个部分组成:卷积编码器、全连接层稠密块。

卷积编码器由两个卷积块构成,每个卷积块包含一个卷积层、一个sigmoid激活函数、一个平均汇聚层。

全连接层稠密块由三个全连接层构成。

用Sequential块实现就是:

net = nn.Sequential(nn.Conv2d(1, 6, kernel_size = 5, padding = 2),nn.Sigmoid(),nn.AvgPool2d(kernel_size = 2, stride = 2),nn.Conv2d(6, 16, kernel_size = 5),nn.Sigmoid(),nn.AvgPool2d(kernel_size = 2, stride = 2),nn.Flatten(),nn.Dense(120, activation='sigmoid'),nn.Dense(84, activation='sigmoid'),nn.Dense(10)
)

然后就可以进行模型训练评估。

相关文章:

记录学习《手动学习深度学习》这本书的笔记(三)

这两天看完了第六章:卷积神经网络,巧的是最近上的专业选修课刚讲完卷积神经网络,什么卷积层池化层听得云里雾里的,这一章正好帮我讲解了基础的知识。 第六章:卷积神经网络 6.1 从全连接层到卷积 在之前的学习中&…...

JS中递归函数的理解及展开运算符在递归种的运用理解

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><title>递归函数</title> </head> <body> <script>const list ["你好", "吃饭了吗",["好",[[&qu…...

人工智能学习用的电脑安装cuda、torch、conda等软件,版本的选择以及多版本切换

接触人工智能的学习三个月了&#xff0c;每天与各种安装包作斗争&#xff0c;缺少依赖包、版本高了、版本低了、不兼容了、系统做一半从头再来了。。。这些都是常态。三个月把单位几台电脑折腾了不下几十次安装&#xff0c;是时候总结一下踩过的坑和积累的经验了。 以一个典型的…...

提高身份证 OCR 识别 API 接口的准确性的方法

身份证OCR识别API接口能够快速、准确地识别并提取身份证上的文字信息&#xff0c;包括姓名、性别、民族、出生日期、住址、身份证号、签发机关、有效期限等关键内容&#xff0c;将其转化为计算机可处理的结构化数据&#xff0c;从而实现身份证信息的自动化录入和处理&#xff0…...

PHP面向对象

在 PHP 中&#xff0c;面向对象编程&#xff08;Object-Oriented Programming&#xff0c;简称 OOP&#xff09;是一种编程范式&#xff0c;它使用“对象”来组织和设计代码。对象是类的实例&#xff0c;类是定义对象特征和行为的蓝图。面向对象编程的主要目标是提高代码的可重…...

Tomcat新手成长之路:安装部署优化全解析(下)

接上篇《Tomcat新手成长之路&#xff1a;安装部署优化全解析&#xff08;上&#xff09;》: link 文章目录 7.应用部署7.1.上下文7.2.启动时进行部署7.3.动态应用部署 8.Tomcat 类加载机制8.1.简介8.2.类加载器定义8.3.XML解析器和 Java 9.JMS监控9.1.简介9.2.启用 JMX 远程监…...

GPT 1到4代的演进笔记

1. GPT-1 标题是 Improving Language Understanding by Generative Pre-Training. 发表于 2018.02, 比 bert(发布于 2018.10) 早了半年. 1.1 动机 困难:NLU 任务是多样的, 有 {textual entailment, question answering, semantic similarity assessment, document classifica…...

vitepress组件库文档项目 markdown语法大全(修正版)

#上次总结的 有些语法是用在markdown文档中的 使用到vitepress项目中有些语法可能有出入 于是我再总结一版 vitepress项目中的markdown语法大全 在阅读本章节之前&#xff0c;请确保你已经对 Markdown 有所了解。如果你还不了解 Markdown &#xff0c;请先学习一些Markdown 教…...

Vue3技术开发,使用纯CSS3动手制作一个3D环绕的相册展示效果,支持传入任意图片.3D轮播相册的组件

主要讲述封装一个3D轮播相册的组件&#xff0c;效果图如下&#xff0c;仅仅传入一个图片的数组即可&#xff0c;效果如下&#xff1a; 使用Vue3技术开发&#xff0c;支持传入任意张数的图片。 使用方法 <template><Swiper :list"list" /> </templat…...

LeetCode 力扣 热题 100道(十五)搜索插入位置(C++)

给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 代码如下所示&#xff1a; class Solution { public:int searchIns…...

【035】基于51单片机俄罗斯方块游戏机【Proteus仿真+Keil程序+报告+原理图】

☆、设计硬件组成&#xff1a;51单片机最小系统LCD12864液晶显示按键控制。 1、设计采用STC89C52、AT89C52、AT89S52作为主控芯片&#xff0c;采用LCD12864液晶作为显示&#xff0c;大屏显示就是刺激&#xff1b; 2、游戏设置十个关卡&#xff0c;每个关卡累计99分即可进入下…...

NAT traversal 原理 | TCP / UDP/ P2P

注&#xff1a;本文为 “NAT traversal ”相关的几篇文章合辑。 未整理去重。 NAT 穿越技术原理 Li_yy123 于 2020-12-08 18:54:26 发布 一、NAT 由来 为了解决全球公有 IPv4 的稀缺&#xff0c;提出了 NAT 技术。NAT 是 Network Address Translation 网络地址转换的缩写。 …...

如何成长为一名工程技术经理

https://medium.com/srivatsan-sridharan/how-to-grow-as-an-engineering-manager-687cad0bcac7 作为一名工程技术经理&#xff0c;你可能已经积累了丰富的团队管理经验&#xff0c;并展示了出色的项目管理、优先级管理和员工指导能力。然而&#xff0c;尽管如此&#xff0c;你…...

GEE开发之下载海拔、坡度、坡向数据

GEE开发之加载海拔、坡度、坡向数据 方法一&#xff1a;加载elevation、slope、aspect和hillshade数据方法二&#xff1a;加载elevation、slope、aspect数据 前言&#xff1a;根据矢量图加载海拔、坡度、坡向和山体阴影。 方法一&#xff1a;加载elevation、slope、aspect和hil…...

gozero项目迁移与新服务器环境配置,包含服务器安装包括go版本,Nginx,项目配置包括Mysql,redis,rabbit,域名

迁移 **GoZero** 项目到新服务器并配置相关环境涉及多个步骤。以下是一个系统化的指南&#xff0c;涵盖服务器环境安装、数据库和缓存配置、项目部署以及域名绑定。 ### 步骤概述 1. **服务器环境配置** - 安装 Go 语言环境 - 安装 Nginx - 安装 MySQL 和 Redis -…...

Scala正则表达式全面教程

一、正则表达式概述 正则表达式&#xff08;Regular Expression&#xff0c;简称RegEx&#xff09;是一种用于字符串搜索和操作的强大工具&#xff0c;它使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在Scala中&#xff0c;正则表达式通过scala.util.matching.…...

伺服电机为什么会变慢?

在现代工业自动化和控制系统中&#xff0c;伺服电机因其高效性和精确的控制能力而被广泛应用于各类机器和设备。然而&#xff0c;在实际使用中&#xff0c;有时用户会发现伺服电机的运行速度出现了下降的现象。这一变化不仅会影响生产效率&#xff0c;还可能对设备的安全性和可…...

61 基于单片机的小车雷达避障及阈值可调

所有仿真详情导航&#xff1a; PROTEUS专栏说明-CSDN博客 目录 一、主要功能 二、硬件资源 三、主程序编程 四、资源下载 一、主要功能 基于51单片机&#xff0c;采用超声波传感器检测距离&#xff0c;通过LCD1602显示屏显示&#xff0c;三个按键&#xff0c;第一个按键是…...

微信小程序之手机归属地查询

微信小程序之手机归属地查询 需求描述 API申请和小程序设置 API申请 第一步&#xff1a;完整账号注册 我们需要来到如下网站&#xff0c;注册账号&#xff1a;万维易源 第二步&#xff1a;账号注册完成以后&#xff0c;点击右上角的控制台信息。 第三步&#xff1a;在控制…...

ElementUI 问题清单

1、form 下面只有一个 input 时回车键刷新页面 原因是触发了表单默认的提交行为&#xff0c;给el-form 加上submit.native.prevent就行了。 <el-form inline submit.native.prevent><el-form-item label"订单号"><el-inputv-model"query.order…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下&#xff0c;江苏艾立泰以一场跨国资源接力的创新实践&#xff0c;重新定义了绿色供应链的边界。 跨国回收网络&#xff1a;废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点&#xff0c;将海外废弃包装箱通过标准…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

scikit-learn机器学习

# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...

宇树科技,改名了!

提到国内具身智能和机器人领域的代表企业&#xff0c;那宇树科技&#xff08;Unitree&#xff09;必须名列其榜。 最近&#xff0c;宇树科技的一项新变动消息在业界引发了不少关注和讨论&#xff0c;即&#xff1a; 宇树向其合作伙伴发布了一封公司名称变更函称&#xff0c;因…...

【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案

目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后&#xff0c;迭代器会失效&#xff0c;因为顺序迭代器在内存中是连续存储的&#xff0c;元素删除后&#xff0c;后续元素会前移。 但一些场景中&#xff0c;我们又需要在执行删除操作…...