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

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

第六章:卷积神经网络

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)
)

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

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

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

相关文章

测试知识-高阻示波器的探头补偿

目录 探头补偿 探头补偿 调节补偿电容 调节补偿电容 探头补偿 设计到一个知识盲点,刚好复习补充下 探头补偿 理论知识 示波器和 10:1 探头的简化模型如上图所示,其中示波器的输入阻抗为 RscopeRscope​,探头的补偿电容为 CcompCcomp​。…

低空经济的第一助推力,基于鸿道Intewell操作系统的无人机控制系统

低空经济背景 低空经济是指利用低空空域资源进行经济活动的总和,包括无人机、通用航空、低空物流等新兴产业。近年来,随着技术的不断突破和政策的支持,低空经济正逐渐成为全球瞩目的新经济增长点。在中国,低空经济的发展受到了政…

软件测试基础详解(自动化测试/安全测试/性能测试)

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 自动化测试的意义 缩短软件开发测试周期,可以让产品更快投放市场 测试效率高,充分利用硬件资源 节省人力资源,降低测试成本 …

最小二乘法实际应用

最小二乘法 使用最小二乘法拟合大气二氧化碳浓度数据 数据保存在monthly_co2.xls文件中(只截取部分) python需要安装的库 xlrdnumpypandasmatplotlib 绘制图像代码(绘制整体数据趋势图) # -*- coding: utf-8 -*- """ File : 绘制趋势图.py Time : …

原生html+css+ajax实现二级下拉选择的增删改及树形结构列出

<?php $db_host localhost; $db_user info_chalide; $db_pass j8c2rRr2RnA; $db_name info_chalide; /* 数据库结构SQL CREATE TABLE categories ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) NOT NULL, parent_id INT DEFAULT 0 ); */ try { $pdo new PD…

Linux操作系统--文件的重定向以及文件缓冲区

目录 前言 一、文件描述符的分配规则 二、重定向 三、系统中的重定向接口 1、dup2()介绍 2、dup2()使用 1&#xff09;输出重定向和追加重定向 2&#xff09;输入重定向 四、文件缓冲区 1、定义 2、缓冲区刷新的条件 1&#xff09;文件缓冲区存在的意义 2&…

5G CPE核心器件-基带处理器(三)

5G CPE 核心器件 -5G基带芯片 基带芯片简介基带芯片组成与结构技术特点与发展趋势5G基带芯片是5G CPE中最核心的组件,负责接入5G网络,并进行上下行数据业务传输。移动通信从1G发展到5G,终端形态产生了极大的变化,在集成度、功耗、性能等方面都取得巨大的提升。 基带芯片简…

mmdection配置-yolo转coco

基础配置看我的mmsegmentation。 也可以参考b站 &#xff1a;https://www.bilibili.com/video/BV1xA4m1c7H8/?vd_source701421543dabde010814d3f9ea6917f6#reply248829735200 这里面最大的坑就是配置coco数据集。我一般是用yolo&#xff0c;这个yolo转coco格式很难搞定&#…

Java 单元测试模拟框架-Mockito 的介绍

Mockito 是什么 Mockito 是一个用于单元测试的模拟框架&#xff0c;基于它可以使用简洁易用的API编写出色的测试。 Mockito 允许开发人员创建和管理模拟对象&#xff08;mock objects&#xff09;&#xff0c;以便在测试过程中替换那些不容易构造或获取的对象。 Mockito的基本…

NiFi-从部署到开发(图文详解)

NiFi简介 Apache NiFi 是一款强大的开源数据集成工具&#xff0c;旨在简化数据流的管理、传输和自动化。它提供了直观的用户界面和可视化工具&#xff0c;使用户能够轻松设计、控制和监控复杂的数据流程&#xff0c;NiFi 具备强大的扩展性和可靠性&#xff0c;可用于处理海量数…

draggable插件——实现元素的拖动排序——拖动和不可拖动的两种情况处理

最近在写后台管理系统的时候&#xff0c;遇到一个需求&#xff0c;就是关于拖动排序的功能。 我之前是写过一个关于拖动表格的功能&#xff0c;此功能可以实现表格中的每一行数据上下拖动实现排序的效果。 vue——实现表格的拖拽排序功能——技能提升 但是目前我这边的需求是…

Delphi Web前端开发教程(9):基于TMS WEB Core框架

3、REST Servers服务端(后端)框架 REST服务端特点&#xff1a; – 为远程资源提供一个REST API接口。也可以为其他网络内容提供服务&#xff1b; – 包括在Delphi Enterprise & Architect企业版和架构师版中的RAD服务器、DataSnap、WebBroker&#xff1b; – 开源框架&a…

利用空闲主机进行Nmap隐匿扫描:IP伪造与空闲扫描技术

IP伪造与空闲扫描技术 在网络安全领域&#xff0c;扫描和识别目标主机的开放端口是攻击者获取目标信息的重要手段。传统的扫描方法可能会暴露扫描者的真实IP地址&#xff0c;从而引起目标主机的警觉。然而&#xff0c;IP地址伪造是一种巧妙的方式&#xff0c;可以帮助攻击者在…

学习视频超分辨率扩散模型中的空间适应和时间相干性(原文翻译)

文章目录 摘要1. Introduction2. Related Work3. Our Approach3.1. Video Upscaler3.2. Spatial Feature Adaptation Module3.3. Temporal Feature Alignment Module3.4. Video Refiner3.5. Training Strategy 4. Experiments4.1. Experimental Settings4.2. Comparisons with …

JavaScript 键盘控制移动

如果你想通过 JavaScript 实现键盘控制对象&#xff08;比如一个方块&#xff09;的移动&#xff0c;下面是一个简单的示例&#xff0c;展示如何监听键盘事件并根据按下的键来移动一个元素。 HTML 和 CSS&#xff1a; <!DOCTYPE html> <html lang"en">…

SpringMVC其他扩展

一、全局异常处理机制: 1.异常处理两种方式: 开发过程中是不可避免地会出现各种异常情况的&#xff0c;例如网络连接异常、数据格式异常、空指针异常等等。异常的出现可能导致程序的运行出现问题&#xff0c;甚至直接导致程序崩溃。因此&#xff0c;在开发过程中&#xff0c;…

Linux-异步IO和存储映射IO

异步IO 在 I/O 多路复用中&#xff0c;进程通过系统调用 select()或 poll()来主动查询文件描述符上是否可以执行 I/O 操作。而在异步 I/O 中&#xff0c;当文件描述符上可以执行 I/O 操作时&#xff0c;进程可以请求内核为自己发送一个信号。之后进程就可以执行任何其它的任务…

docker更换容器存储位置

一&#xff1a;原因 今天之前在某个服务器上使用docker搭建的服务突然无法访问了&#xff0c;进入服务器查看发现服务运行正常&#xff0c;但是就是无法使用&#xff0c;然后我这边准备将docker服务重新启动下看看&#xff0c;发现docker服务无法重启&#xff0c;提示内存已满…

工业—使用Flink处理Kafka中的数据_ProduceRecord2

使用 Flink 消费 Kafka 中 ProduceRecord 主题的数据,统计在已经检验的产品中,各设备每 5 分钟 生产产品总数,将结果存入HBase 中的 gyflinkresult:Produce5minAgg 表, rowkey“

外卖开发(二)开发笔记——DTO、自定义全局异常处理、ThreadLocal、日期格式化

外卖开发&#xff08;二&#xff09;开发笔记 一、DTO二、自定义全局异常处理三、ThreadLocal存入、提取当前登陆用户的id四、日期格式化1、实体类属性上加入注解JsonFormat2、在WebMvcConfiguration中扩展SpringMVC的消息转换器 一、DTO 数据传输对象&#xff08;DTO&#xf…