当前位置: 首页 > 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…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...

Linux 中如何提取压缩文件 ?

Linux 是一种流行的开源操作系统&#xff0c;它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间&#xff0c;使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的&#xff0c;要在 …...

区块链技术概述

区块链技术是一种去中心化、分布式账本技术&#xff0c;通过密码学、共识机制和智能合约等核心组件&#xff0c;实现数据不可篡改、透明可追溯的系统。 一、核心技术 1. 去中心化 特点&#xff1a;数据存储在网络中的多个节点&#xff08;计算机&#xff09;&#xff0c;而非…...

C++_哈希表

本篇文章是对C学习的哈希表部分的学习分享 相信一定会对你有所帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、基础概念 1. 哈希核心思想&#xff1a; 哈希函数的作用&#xff1a;通过此函数建立一个Key与存储位置之间的映射关系。理想目标&#xff1a;实现…...

从零手写Java版本的LSM Tree (一):LSM Tree 概述

&#x1f525; 推荐一个高质量的Java LSM Tree开源项目&#xff01; https://github.com/brianxiadong/java-lsm-tree java-lsm-tree 是一个从零实现的Log-Structured Merge Tree&#xff0c;专为高并发写入场景设计。 核心亮点&#xff1a; ⚡ 极致性能&#xff1a;写入速度超…...

【1】跨越技术栈鸿沟:字节跳动开源TRAE AI编程IDE的实战体验

2024年初&#xff0c;人工智能编程工具领域发生了一次静默的变革。当字节跳动宣布退出其TRAE项目&#xff08;一款融合大型语言模型能力的云端AI编程IDE&#xff09;时&#xff0c;技术社区曾短暂叹息。然而这一退场并非终点——通过开源社区的接力&#xff0c;TRAE在WayToAGI等…...

深入理解 React 样式方案

React 的样式方案较多,在应用开发初期,开发者需要根据项目业务具体情况选择对应样式方案。React 样式方案主要有: 1. 内联样式 2. module css 3. css in js 4. tailwind css 这些方案中,均有各自的优势和缺点。 1. 方案优劣势 1. 内联样式: 简单直观,适合动态样式和…...