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

深度学习笔记13-卷积神经网络1

1.卷积神经网络

        卷积神经网络(CNN),它是由多个卷积层、池化层和全连接层构成的前馈神经网络。在卷积神经网络中,包含了可训练的卷积核,这使得卷积神经网络具有强大的表征学习能力。卷积神经网络通过卷积层和池化层进行特征提取,通过全连接层和输出层进行分类。因此卷积神经网络是一种端到端的机器学习模型。

CNN与传统模型

        卷积神经网络已被广泛用于计算机视觉领域,全面取代传统的机器学习模型。传统的机器学习很难解决复杂的图像处理任务,因为传统的模型无法直接进行特征提取,缺乏特征表达能力。如果使用预训练的深度卷积神经网络(例如VGG19网络,进行图片分类),可以使用非常少的训练样本,达到很好的效果。不只是计算机视觉领域,在NLP等其他问题中,CNN同样表现出色。

        无论是计算机视觉还是NLP领域,深度学习正在不断代替传统的机器学习模型。

CNN与全连接网络

        在使用全连接的前馈神经网络处理图像时,会存在“参数过多”和“局部不变性”两个问题,卷积神经网络可以很好的解决这两个问题。

2.卷积层中的卷积运算

        卷积是数学分析中的一种运算,广泛应用于信号处理,图像处理和深度学习等领域。卷积神经网络中通常使用互相关运算,来实现卷积层中的计算。例如在处理图像数据时,卷积核和图像数据都是一个二维数组,将卷积核数据和图像数据进行卷积运算,就会得到一个输出数据。在计算时,卷积运算会将卷积核中的每个元素,与它对应的输入数据中的元素相乘,再把所有乘积加到一起。

        

5*0+0*(-3)+(-3)*1+4*1+1*2+0*(-3)+0*(-4)+(-2)*0+3*1=6

卷积运算的通用公式

:\begin{bmatrix} x_{11} &x_{12} &x_{13} &x_{14} \\ x_{21} &x_{22} &x_{23} &x_{24} \\ x_{31} &x_{32} &x_{33} &x_{34} \\ x_{41} &x_{42} &x_{43} &x_{44} \end{bmatrix} \circledast \begin{bmatrix} w_{11} & w_{12} &w_{13} \\ w_{21} & w_{22} &w_{23} \\ w_{31} & w_{32} &w_{33} \end{bmatrix}=\begin{bmatrix} y_{11} &y_{12} \\ y_{21}&y_{22} \end{bmatrix}

y_{11}=x_{11}*w_{11}+x_{12}+w_{12}+x_{13}*w_{13}+x_{21}*w_{21}+x_{22}*w_{22}+x_{23}*w_{23}+x_{31}*w_{31}+x_{32}*w_{32}+x_{33}*w_{33}

y_{12}=x_{12}*w_{11}+x_{13}*w_{12}+x_{14}*w_{13}+x_{22}*w_{21}+x_{23}*w_{22}+x_{24}*w_{23}+x_{32}*w_{31}+x_{33}*w_{32}+x_{34}*w_{33}

y_{21}=x_{21}*w_{11}+x_{22}*w_{12}+x_{23}*w_{13}+x_{31}*w_{21}+x_{32}*w_{22}+x_{33}*w_{23}+x_{41}*w_{31}+x_{42}*w_{32}+x_{43}*w_{33}

y_{22}=x_{22}*w_{11}+x_{23}*w_{12}+x_{24}*w_{13}+x_{32}*w_{21}+x_{33}*w_{22}+x_{34}*w_{23}+x_{42}*w_{31}+x_{43}*w_{32}+x_{44}*w_{33}

y_{ij}=\ \sum_{u=1}^{m}\sum_{v=1}^{n}w_{uv}\cdot x_{i+u-1,j+v-1}

卷积核中的参数

        卷积核中的数据就是卷积神经网络中的可训练参数。3*3的卷积核就包括9个待训练的参数(w_{11}-w_{33}),卷积层类似于全连接层,除了w参数还有b参数,完成卷积运算后,会向每个输出数据都加上一个偏置b

3.图像边缘检测 

Python实现卷积运算

import numpy as np
#函数传入输入张量x和卷积核张量K
#在函数中,计算X和K的互相关运算结果
def correlation2d(X,K):Xh,Xw=X.shape#保存输入数据的高度和宽度Kh,Kw=K.shape#保存卷积核的高度和宽度#输出数据的大小等于输入数据的大小减去卷积核的大小,再加1Yh=Xh-Kh+1#计算输出数据的高度Yw=Xw-Kw+1#计算输出数据的宽度Y=np.zeros((Yh,Yw))#保存输出的结果#通过两层循环计算出数组Y的值for i in range(Yh):#第一层循环Y的高度for j in range(Yw):#第二层循环Y的宽度#取出对应位置的输入数据X,保存到sub中sub=X[i:i+Kh,j:j+Kw]#计算输出结果YY[i,j]=(sub*K).sum()#打印出当前的i、j、sub和Y,进行调试print('i=%d j=%d'%(i,j))print(sub)print(Y[i,j])print('')return Y#返回结果Y

1.局部窗口 sub = X[i:i+Kh, j:j+Kw]

  • 这行代码通过切片操作,从输入 X 中取出一个与卷积核 K 大小相同的子矩阵(也称为感受野)。
  • i:i+Kh 表示子矩阵在 X 上的行范围,j:j+Kw 表示子矩阵在 X 上的列范围。
  • KhKw 分别是卷积核 K 的高度和宽度。

2.卷积计算 Y[i, j] = (sub * K).sum()

  • 将提取出的局部窗口 sub 与卷积核 K 进行逐元素相乘操作 (sub * K),得到的结果再进行 .sum() 操作求和。
  • 这一步的结果是该位置的卷积输出值,将其保存到输出矩阵 Y 中的 (i, j) 位置。

测试函数效果: 

if __name__=='__main__':#测试函数的效果X=np.array([[1,2,3,0],[0,1,2,3],[3,0,1,2],[2,3,0,1]])K=np.array([[2,0,1],[0,1,2],[1,0,2]])result=correlation2d(X,K)print(f'result=\n {result}')

边缘检测 

#将真实图片转为一个灰色通道
def rgb_to_gray(rgb):r,g,b=rgb[:,:,0],rgb[:,:,1],rgb[:,:,2]gray=0.2989*r+0.5870*g+0.1140*breturn gray

        这段代码实现了将 RGB 图像转换为灰度图像的功能。具体来说,它使用了人眼对不同颜色通道的感知权重(红、绿、蓝通道的加权平均)来转换为灰度值。 

 #对一张真实图片进行边缘检测img=plt.imread('C:/Users/lenovo/Pictures/img01.png')plt.imshow(img)plt.show()#将它转为灰色通道后再进行卷积运算img=rgb_to_gray(img)

        定义一个3*3的卷积核,中间的时数字8,周围时-1,这个卷积核被称为拉普拉斯算子,通过卷积核可以将图像的边缘显示出来。相同的9个数字和拉普拉斯卷积核计算时,会得到数字0。如果9个数字不完全相同时,计算的结果就不是0。输出数据中不为0的数据,就对应图像的边缘。

#拉普拉斯算子kernel=np.array([[-1,-1,-1],[-1,8,-1],[-1,-1,-1]])#计算img和卷积核kernel的互相关运算img=correlation2d(img,kernel)fig=plt.imshow(img)#将他展示出来,可以看到img的边缘显示出来了plt.show()

 

4.卷积核的训练

        已知,图像原始数据,和这个图像经过某卷积核计算后的新数据,求卷积核中的具体参数。

        在Pytorch中最常使用的卷积层接口是nn.Conv2d,它实现了二维卷积运算的功能,在创建卷积神经网络的卷积层时就需要这个接口。对于Conv2d接口,其中in_channels(输入通道数)、out_channels(输出通道数)和kernel_size(卷积核大小)是必须传入的参数。

import torch
from torch import nn
from torch.nn import functional as Fif __name__ == '__main__':#声明img数组,保存输入的图像img=torch.tensor([[[[0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,100,100,100,100,100,100,0,0,0],[0,0,0,100,100,100,100,100,100,0,0,0],[0,0,0,100,100,100,100,100,100,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0]]]],dtype=torch.float)#设置一个拉普拉斯卷积核用作输出数据Y的生成kernel=torch.tensor([[[[-1,-1,-1],[-1,8,-1],[-1,-1,-1]]]],dtype=torch.float)#计算img和kernal的互相关运算,结果保存在Y中Y=F.conv2d(img,kernel)

        在后面的训练中只会使用img和Y,不会使用kernel,这里使用kernel是为了计算Y。后面要根据img和Y,重新训练出kernel中的参数。

    conv=nn.Conv2d(in_channels=1,out_channels=1,kernel_size=3,bias=False)#设置学习速率0.0000001和迭代次数10000lr=1e-7num=10000#进入卷积核的迭代循环for i in range(num):#计算基于当前参数的预测值predictpredict=conv(img)#根据平方误差,计算预测值和真实值之间的损失值loss=(predict-Y)**2#使用backward函数进行反向传播#计算出损失loss关于参数weight的梯度loss.sum().backward()#使用梯度下降算法,更新weight中保存的数据conv.weight.data-=lr*conv.weight.grad.dataconv.weight.grad.zero_()#清空上一轮迭代梯度#每迭代1000轮,打印一次lossif (i+1)%1000==0:print('epoch %d loss %.3lf'%(i+1,loss.sum()))print(conv.weight.data.reshape((3,3)))

5.卷积运算的填充和步幅 

        卷积运算的两个重要参数分别是填充(padding)和步幅(stride)。它们决定了输出结果的大小和特征提取的方式。

        在输入数据和卷积和运算的时候,如果卷积核的尺寸大于1,输出结果的尺寸会小于输入数据的尺寸,输出数据的形状为:(H-Kh+1)*(W-Kw+1)。说明在卷积核尺寸大于1的情况下,如果输入数据经过多次卷积运算,输出数据的尺寸就会不断变小。为了避免这种情况,就需要在图片的外围数据进行填充。例如4*4的数据,外围填充一圈后会变为6*6的数据,这样经过卷积运算后输出数据的尺寸就不会变小。填充的数据一般是0。另外只是对原数据在周围填充一圈0,这不会对计算结果产生太大影响。

        步幅也被称为步长,在进行卷积运算的时候,卷积窗口在数据上滑动,每次滑动的像素被称为步幅。通过增加步幅可以使卷积核更快的扫描数据。

输出数据与填充和步幅的关系

输入矩阵(m*n):X\in R^{M*N}

卷积核W(u*v):W\in R^{U*V} 

填充P,步长S

最终输出矩阵的大小:{M}'=\frac{M+2P-U}{S}+1

                                    {N}'=\frac{N+2P-V}{S}+1

        另外,如果步长大于1,很可能出现无法除尽的情况,也就使窗口在扫描的时候,不能恰好将全部数据扫描完整。解决方法有:报错或者直接四舍五入算出近似的值。

6.特征图和感受野 

        图像处理中,卷积运算是特征提取的有效方法,一个图像在经过卷积运算后得到的结果被称为特征图。在一个卷积层中,可以包含多个卷积核,每个卷积核都可以提取图像的一组特征,生成对应的特征图,不同的卷积核相当于不同的特征提取器。一个图像经过不同的卷积层和池化层会生成不同大小不同数量的特征图。

        影响某个计算结果的所有可能的输入区域叫做感受野。输入图像中的任意元素的改变都会影响这个输出点的输出值。我们可以通过更深的卷积神经网络,使特征图中的单个元素的感受野变得更加广阔,从而捕捉到在输入图片上更大的尺寸特征。这时输出特征图中的一个像素点,就会包含原图像中更多的语义信息。卷积神经网络越深,越能感受到原始输入图片中更大的范围。因此当增加卷积神经网络的深度时,可以获得输入图片上,更大尺寸的特征。

相关文章:

深度学习笔记13-卷积神经网络1

1.卷积神经网络 卷积神经网络(CNN),它是由多个卷积层、池化层和全连接层构成的前馈神经网络。在卷积神经网络中,包含了可训练的卷积核,这使得卷积神经网络具有强大的表征学习能力。卷积神经网络通过卷积层和池化层进行…...

【新华妙笔-注册/登录安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 1. 暴力破解密码,造成用户信息泄露 2. 短信盗刷的安全问题,影响业务及导致用户投诉 3. 带来经济损失,尤其是后付费客户,风险巨大,造…...

STM32电源管理—实现低功耗

注: 本文是学习野火的指南针开发板过程的学习笔记,可能有误,详细请看B站野火官方配套视频教程(这个教程真的讲的很详细,请给官方三连吧) 在响应绿色发展的同时,在很多应用场合中都对电子设备的功…...

【链路层】空口数据包详解(4):数据物理通道协议数据单元(PDU)

目录 一、概述 1.1. 头部(Header)结构 1.2. MIC字段的情况说明 1.3. 有效载荷(Payload)格式与LLID字段的关联 二、LL Data PDU 2.1. 定义与用途 2.2. 头部字段设置 2.3. 空PDU(Empty PDU ) 2.4. 数…...

数学分组求偶数和

问题描述 小M面对一组从 1 到 9 的数字,这些数字被分成多个小组,并从每个小组中选择一个数字组成一个新的数。目标是使得这个新数的各位数字之和为偶数。任务是计算出有多少种不同的分组和选择方法可以达到这一目标。 numbers: 一个由多个整数字符串组…...

机器学习基础02_特征工程

目录 一、概念 二、API 三、DictVectorize字典列表特征提取 四、CountVectorize文本特征提取 五、TF-IDF文本1特征词的重要程度特征提取 六、无量纲化预处理 1、MinMaxScaler 归一化 2、StandardScaler 标准化 七、特征降维 1、特征选择 VarianceThreshold 底方差…...

CSS Modules中的 :global

最近写需求遇到如下代码,我们来分析一番: .medicine-bot {:global(.cosd-site-vcard-card) {margin-top: -3px;}:global(.cosd-site-vcard-title-text) {font-size: var(--cos-text-headline-sm);}:global(.cosd-site-vcard-button) {background-color: …...

linux病毒编写+vim shell编程

学习视频来自B站UP主泷羽sec,如涉及侵权马上删除文章 感谢泷羽sec 团队的教学 请一定遵循《网络空间安全法》!!! Linux目录介绍 /bin 二进制可执行文件(kali里面是工具一些文件)/etc 系统的管理和配置文…...

WinDefender Weaker

PPL Windows Vista / Server 2008引入 了受保护进程的概念,其目的不是保护您的数据或凭据。其最初目标是保护媒体内容并符合DRM (数字版权管理)要求。Microsoft开发了此机制,以便您的媒体播放器可以读取例如蓝光,同时…...

智能工厂的设计软件 为了监管控一体化的全能Supervisor 的监督学习 之 序5 架构for认知系统 总述 (架构全图)

本文提要 本文讨论的“智能工厂的设计软件” for认知系统的架构全图 ,这有别于前面所说的“智能工厂的设计软件”的“全景图”。两者在内容和侧重点上有所不同,但它们共同构成了对智能工厂设计软件的全面描述。 全景图是对智能工厂设计软件的整体概览&…...

vmware集群 vSAN HCL 数据库

HCL数据库升级 https://partnerweb.vmware.com/service/vsan/all.json VSAN版本目录升级 https://vcsa.vmware.com/ph/api/v1/results?deploymentId2d02e861-7e93-4954-9a73-b08692a330d1&collectorIdVsanCloudHealth.6_5&objectId0c3e9009-ba5d-4e5f6-bae8-f25ec5…...

人工智能引发直播革命:AI 技术塑造无人直播全新体验

在数字化浪潮席卷全球的今天,人工智能(AI)技术以其无与伦比的速度和广度,正深刻地改变着各行各业的面貌。其中,直播行业作为新媒体时代的宠儿,也迎来了由AI技术引领的颠覆性变革。这场由人工智能引发的直播…...

数据研发基础 | 什么是流批一体

流批一体的概念是可能出现在大厂的面试题中的,虽然就算大厂实习也没机会实操这样的高级操作,学一点概念,面试多少是能说上一两句的。大致就是希望一套代码能同时在批处理和流处理中运行(同时做离线计算和实时计算)。下…...

《Python网络安全项目实战》项目6 编写密码工具程序

《Python网络安全项目实战》项目6 编写密码工具程序 项目6 编写密码工具程序任务6.1 猜数字游戏任务描述任务分析任务实施6.1.1 编写基本的猜数字程序6.1.3 测试并修改程序6.1.4 给程序增加注释 任务拓展任务实施6.2.1 生成随机密码6.2.4 菜单功能 相关知识1. 密码字典2. 密码字…...

现代C++HTTP框架cinatra

文章目录 cinatra简介主要特点 快速上手编译器版本要求使用指南快速示例 项目地址 cinatra简介 cinatra是一个基于C20协程的高性能HTTP框架,它的目标是提供一个快速开发的C HTTP框架解决方案 它不仅支持HTTP/1.1和1.0,还支持SSL和WebSocket&#xff0c…...

【功耗现象】com.gorgeous.lite后台Camera 使用2小时平均电流200mA耗电量400mAh现象

现象 轻颜相机(com.gorgeous.lite)后台Camera 使用2小时平均电流200mA(BugReport提供的电流参考数据),耗电量400mAh 即耗电占比(200mA*2h)/(12.83h*52.68mA )400mAh/623mAh62% CameraOct 10 202321:03:08 - 23:03:372h16m15s859ms to 4h16m44s984msactive duration: 2h 0m 29…...

06.VSCODE:备战大项目,CMake专项配置

娇小灵活的简捷配置不过是年轻人谈情说爱的玩具,帝国大厦的构建,终归要交给CMake去母仪天下。一个没有使用 CMake 的 C 项目,就像未来世界里的一台相声表演,有了德纲却无谦,观众笑着遗憾。—— 语出《双城记》作者&…...

还是小时候味道的麻辣片

麻辣片的诞生,源于人们对辣味的热爱和对丰富口感的追求。它将辣椒的火辣、香料的浓郁和豆制品的醇厚完美结合在一起,创造出了一种令人回味无穷的美食体验。无论是在学校的小卖部、街头的小吃摊,还是超市的货架上,麻辣片都以其鲜艳…...

GaussDB部署架构

GaussDB部署架构 云数据库GaussDB管理平台(TPOPS)基于B/S架构开发,由Web、管控Service、管控Agent三部分组成,软件结构如图1所示。 图1 各节点部署架构 Web:作为用户接入子系统,用于将用户在Web下发的操作…...

遥测数据采集工具Grafana Alloy

介绍 Alloy是Grafana产品公司旗下的一款新主推遥测数据采集工具,Grafana Alloy也是一个开源OpenTelemetry收集器,具有内置 Prometheus管道并支持指标、日志、跟踪和配置文件。Alloy支持为OTEL、Prometheus、Pyroscope、Loki等服务提供许多指标、日志、跟…...

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…...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...

树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频

使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

【单片机期末】单片机系统设计

主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...