六、卷积神经网络(CNN)基础


卷积神经网络(CNN)基础

  • 前言
  • 一、CNN概述
  • 二、卷积层
    • 2.1 卷积
    • 2.2 步幅(Stride)
    • 2.3 填充(Padding)
    • 2.4 多通道卷积
    • 2.5 多卷积计算
    • 2.6 特征图大小计算
    • 2.7 代码演示
  • 三、池化层
    • 3.1 池化层计算
      • 3.1.1 最大池化层
      • 3.1.2 平均池化层
    • 3.2 填充(Padding)
    • 3.3 步幅(Stride)
    • 3.4 多通道池化计算
    • 3.5 代码演示
  • 总结


前言

  • 卷积神经网络(convolutional neural network,CNN)是一类强大的、为处理图像数据而设计的神经网络。
  • 基于卷积神经网络架构的模型在计算机视觉领域中已经占主导地位,当今几乎所有的图像识别、目标检测或语义分割相关的学术竞赛和商业应用都以这种方法为基础。

一、CNN概述

  • 卷积神经网络(Convolutional Neural Network)是含有卷积层的神经网络
  • 卷积层的作用就是用来自动学习、提取图像的特征
  • 主要由三部分组成:
    • 卷积层:负责提取图像中的局部特征
    • 池化层:用来大幅降低参数量级(降维)
    • 全连接层:用来输出想要的结果

二、卷积层

  • 卷积层其实就是将我们输入的张量通过与卷积核的运算得到新的张量的过程
    在这里插入图片描述
  • Input 表示输入的张量
  • Filter 表示卷积核, 也叫做卷积核(滤波矩阵)
  • Input 经过 Filter 得到输出为最右侧的图像,该图叫做特征图

2.1 卷积

  • 卷积运算本质上就是在卷积核和输入数据的局部区域间做点积
  • Output的第一行第一个数计算过程:
    • 1 ∗ 1 + 1 ∗ 0 + 1 ∗ 1 + 0 ∗ 0 + 1 ∗ 1 + 1 ∗ 0 + 0 ∗ 1 + 0 ∗ 0 + 1 ∗ 1 = 4 1*1+1*0+1*1+0*0+1*1+1*0+0*1+0*0+1*1=4 11+10+11+00+11+10+01+00+11=4
      在这里插入图片描述
  • 卷积通过移动,对不同位置进行卷积运算,最终的特征图结果为:
    在这里插入图片描述

2.2 步幅(Stride)

  • 上述演示中卷积核的步幅(移动步长)为1,其计算特征图过程如下:
    在这里插入图片描述
  • 如果步长变成 2,则计算特征图过程就变成:
    在这里插入图片描述

2.3 填充(Padding)

  • 通过上面的卷积计算过程,最终的特征图比原始图像小很多,如果想要保持经过卷积后的图像大小不变, 可以在原图周围添加 Padding 来实现.
    在这里插入图片描述

2.4 多通道卷积

  • 实际上我们处理的图像都是多通道组成,那么我们怎么计算卷积呢?

在这里插入图片描述

  • 我们对每个通道的输入,分别与卷积核进行运算,得到的三个卷积后的tensor,然后将三个tensor进行加法运算,得到最终的tensor:
    在这里插入图片描述

2.5 多卷积计算

在这里插入图片描述

  • 当使用多个卷积核的时候,我们会对每个卷积核与输入的张量进行卷积,最后得到的是两个卷积后的tensor,我们可以根据需要,将其进行堆叠。

在这里插入图片描述

2.6 特征图大小计算

  • 公式:
    N = W − F + 2 P S + 1 N = \frac{W-F+2P}{S}+1 N=SWF+2P+1

    • 输入图像大小: W W W x W W W
    • 卷积核大小: F F F x F F F
    • Stride: S S S
    • Padding: P P P
    • 输出图像大小: N N N x N N N
  • 举例:

    • 图像大小: 5 x 5
    • 卷积核大小: 3 x 3
    • Stride: 1
    • Padding: 1
    • (5 - 3 + 2) / 1 + 1 = 5, 即得到的特征图大小为: 5 x 5
      在这里插入图片描述

2.7 代码演示

代码演示如下:

conv = nn.Conv2d(in_channels, out_channels, kernel_size, stride, padding)
"""
参数说明:in_channels:输入的通道数out_channels:输出通道,也可以理解为卷积核kernel的数量kernel_size:卷积核的高和宽设置,一般设置为3,5,7....stride:卷积核移动的步长padding:在四周加入的padding的数量,默认补 0"""
import torch
import torch.nn as nn
import matplotlib.pyplot as pltdef my_test():# 读取图像, 形状: (640, 640, 3)img = plt.imread('data/img.jpg') # 这里放你们的图片路径,绝对路径和相对路径都可以plt.imshow(img)plt.axis('off')plt.show()# 构建卷积层# out_channels表示卷积核个数# 修改out_channels,stride,padding观察特征图的变化情况conv = nn.Conv2d(in_channels=3, out_channels=3, kernel_size=3, stride=2, padding=0)# 输入形状: (BatchSize, Channel, Height, Width)# img形状: torch.Size([3, 640, 640])img = torch.tensor(img).permute(2, 0, 1)# img形状: torch.Size([1, 3, 640, 640])img = img.unsqueeze(0)# 将图像送入卷积层中feature_map_img = conv(img.to(torch.float32))# 打印特征图的形状print(feature_map_img.shape) if __name__ == '__main__':my_test()# 输入的图像原来是 (640, 640, 3),然后经过维度变化后变成了(3,640,640),
# 再转成tensor就变成(1,3,640,640)
# 经过卷积运算后变成了(1,3,319,319) 除不尽的时候舍弃小数位

三、池化层

  • 池化层 (Pooling) 是为了降低维度, 缩减模型大小,提高计算速度.

3.1 池化层计算

3.1.1 最大池化层

  • 当确定了池化窗口大小的时候,取窗口内最大的数作为池化后的一个结果
    在这里插入图片描述

3.1.2 平均池化层

  • 当确定了池化窗口大小的时候,取窗口内所有的数取平均值作为池化后的一个结果
    在这里插入图片描述

3.2 填充(Padding)

在这里插入图片描述

3.3 步幅(Stride)

在这里插入图片描述

3.4 多通道池化计算

在这里插入图片描述

3.5 代码演示

代码演示如下:

# 最大池化
nn.MaxPool2d(kernel_size=2, stride=2, padding=1)
# 平均池化
nn.AvgPool2d(kernel_size=2, stride=1, padding=0)
  1. 单通道池化
import torch
import torch.nn as nndef test01():# 定义输入输数据 【1,3,3 】inputs = torch.tensor([[[0, 1, 2],[3, 4, 5], [6, 7, 8]]]).float()# 修改stride,padding观察效果# 1. 最大池化polling = nn.MaxPool2d(kernel_size=2, stride=1, padding=0)output = polling(inputs)print("最大池化:\n", output)# 2. 平均池化polling = nn.AvgPool2d(kernel_size=2, stride=1, padding=0)output = polling(inputs)print("平均池化:\n", output)if __name__ == '__main__':test01()
"""
经过最大池化后的tensor:tensor([[[4., 5.],[7., 8.]]])经过最大池化后的tensor:tensor([[[2., 3.],[5., 6.]]])
"""
  1. 多通道池化
import torch
import torch.nn as nndef test02():# 定义输入输数据 【3,3,3 】inputs = torch.tensor([[[0, 1, 2], [3, 4, 5], [6, 7, 8]],[[10, 20, 30], [40, 50, 60], [70, 80, 90]],[[11, 22, 33], [44, 55, 66], [77, 88, 99]]]).float()# 最大池化polling = nn.MaxPool2d(kernel_size=2, stride=1, padding=0)output = polling(inputs)print("多通道池化:\n", output)if __name__ == '__main__':test02()"""
多通道池化:tensor([[[ 4.,  5.],[ 7.,  8.]],[[50., 60.],[80., 90.]],[[55., 66.],[88., 99.]]])
"""

总结

  • 我们对卷积神经网络中的卷积层和池化层做了演示,并且进行了相关代码的展示。

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

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

相关文章

通过vite+vue3+pinia从0到1搭建一个uniapp应用

最近项目上要做一个app,选择了用uniapp作为开发框架;我大概看了一下uniapp的文档,根据文档从0到1搭了一个uniapp应用供大家参考。 因为本人习惯使用了WebStorm编译器,但是uniapp官方推荐使用HBuilder搭建,如果和我一样…

【Pytorch】torch.nn.functional模块中的非线性激活函数

在使用torch.nn.functional模块时,需要导入包: from torch.nn import functional 以下是常见激活函数的介绍以及对应的代码示例: tanh (双曲正切) 输出范围:(-1, 1) 特点:中心对称,适合处理归一化后的数据…

java-贪心算法

1. 霍夫曼编码(Huffman Coding) 描述: 霍夫曼编码是一种使用变长编码表对数据进行编码的算法,由David A. Huffman在1952年发明。它是一种贪心算法,用于数据压缩。霍夫曼编码通过构建一个二叉树(霍夫曼树&a…

【数据结构】【线性表】【练习】反转链表

申明 该题源自力扣题库19&#xff0c;文章内容&#xff08;代码&#xff0c;图表等&#xff09;均原创&#xff0c;侵删&#xff01; 题目 给你单链表的头指针head以及两个整数left和right&#xff0c;其中left<right&#xff0c;请你反转从位置left到right的链表节点&…

实时数仓:Lambda架构和Kappa架构有什么联系和区别

Kappa 和 Lambda 架构是处理大数据和实时数据流的两种不同设计模式。以下是对这两种架构的概述和比较&#xff1a; Lambda 架构 定义&#xff1a; Lambda 架构的全称是 Lambda Architecture。这个架构旨在处理大规模数据&#xff0c;结合了批处理和流处理的优点&#xff0c;以…

vllm源码解析(一):整体架构与推理代码

vlllm官方代码更新频发,每个版本都有极大变动, 很难说哪个版本好用. 第一次阅读vllm源码是0.4.0版本,对这版圈复杂度极高的调度代码印象深刻 0.4.1对调度逻辑进行重构,完全大变样, 读代码速度快赶不上迭代的速度了。 现在已经更新到0.5.4, 经过长时间观察&#xff0c;发现主要的…

数据库index(索引)使用注释事项

1、索引类型&#xff0c;通常选择NORMAL或者UNIQUE. NORMAL&#xff1a;正常的一种索引吧。 UNIQUE:索引列必须是不能重复的。 2、索引方法&#xff1a;通常选择BTREE 3、使用SQL查询的时候&#xff0c;不需要特别处理索引的字段。数据库会自动的处理&#xff0c;提升SQL的查…

集成了高性能ARM Cortex-M0+处理器的一款SimpleLink 2.4 GHz无线模块-RF-BM-2340B1

蓝牙模组 - RF-BM-2340B1是基于美国TI的CC2340R5为核心设计的一款SimpleLink 2.4 GHz 无线模块。支持Bluetooth 5.3 Low Energy、Zigbee 、IEEE 802.15.4g、TI 15.4-Stack (2.4 GHz)及私有协议。集成了高性能ARM Cortex-M0处理器&#xff0c;具有512 KB Flash、32 KB超低泄漏SR…

[QDS]从零开始,写第一个Qt Design Studio到程序调用的项目

前言 最近在使用Qt Design Studio进行开发&#xff0c;但是简中网上要不就是只搜得到Qt Designer(Qt Creator内部库)&#xff0c;要不就只搜得到一点营销号不知道从哪里搬来的账号&#xff0c;鉴于Qt Design Studio是一个这么强大的软件&#xff0c;自然是需要来进行一下小小的…

Spring Boot实现License生成和校验

Spring Boot实现License生成和校验 证书准备 # 1. 生成私钥库 # validity&#xff1a;私钥的有效期&#xff08;天&#xff09; # alias&#xff1a;私钥别称 # keystore&#xff1a;私钥库文件名称&#xff08;生成在当前目录&#xff09; # storepass&#xff1a;私钥库密码…

【大模型推理】vLLM 源码学习

强烈推荐 https://zhuanlan.zhihu.com/p/680153425 sequnceGroup 存储了相同的prompt对应的不同的sequence, 所以用字典存储 同一个Sequence可能占据多个逻辑Block&#xff0c; 所以在Sequence 中用列表存储 同一个block 要维护tokens_id 列表, 需要添加操作。 还需要判断blo…

核心速览12

研究背景 研究问题&#xff1a;这篇文章探讨了多模态人工智能&#xff08;Agent AI&#xff09;系统在理解和响应视觉和语言输入方面的潜力&#xff0c;特别是在物理和虚拟环境中的应用。Agent AI旨在通过感知和行动来增强人工智能系统的交互性和适应性。研究难点&#xff1a;…

【pyspark学习从入门到精通14】MLlib_1

目录 包的概览 加载和转换数据 在前文中&#xff0c;我们学习了如何为建模准备数据。在本文中&#xff0c;我们将实际使用这些知识&#xff0c;使用 PySpark 的 MLlib 包构建一个分类模型。 MLlib 代表机器学习库。尽管 MLlib 现在处于维护模式&#xff0c;即它不再积极开发…

从 IDC 到云原生:稳定性提升 100%,成本下降 50%,热联集团的数字化转型与未来展望

作者&#xff1a;金峰&#xff08;项良&#xff09;、朱永林、赵世振&#xff08;寰奕&#xff09; 公司简介 杭州热联集团股份有限公司成立于 1997 年 10 月&#xff0c;是隶属杭州市实业投资集团的国有控股公司。公司专业从事国际、国内钢铁贸易黑色大宗商品及产业服务&…

若依springboot 删除一直转 问题处理

src\main\resources\static\ruoyi\js\ry-ui.js submit方法1578行添加 $.operate.successCallback(result); 在线体验 admin/admin123陆陆续续收到一些打赏&#xff0c;为了更好的体验已用于演示服务器升级。谢谢各位小伙伴。 演示地址&#xff1a;http://ruoyi.vip 文档地址…

面向未来的智能视觉参考设计与汽车架构,思尔芯提供基于Arm技术的创新方案

引言&#xff1a; 随着科技的飞速发展&#xff0c;智能视觉IoT已成为科技领域的热门话题&#xff0c;为智能家居、智慧城市等领域带来新机遇。然而&#xff0c;物联网市场的碎片化特性对智能视觉芯片设计构成挑战。同时&#xff0c;汽车行业正经历技术驱动的变革&#xff0c;软…

Multiple instance learning with graph neural networks文献笔记

基本信息 文章链接&#xff1a;[1906.04881] Multiple instance learning with graph neural networks 将每个包视为一个图&#xff0c;利用GNN学习包的嵌入&#xff0c;以探索包中实例之间有用的结构信息。最终的图表示被送入分类器进行标签预测。 具体方法 输入&#xff…

Elasticsearch是如何实现Master选举的?

大家好&#xff0c;我是锋哥。今天分享关于【Elasticsearch是如何实现Master选举的&#xff1f;】面试题。希望对大家有帮助&#xff1b; Elasticsearch是如何实现Master选举的&#xff1f; Elasticsearch 使用 Zen Discovery 插件&#xff08;在较新的版本中是基于 Zen2&…

WEB-通用漏洞SQL注入CTF二次堆叠DNS带外

知识点&#xff1a; 1、数据库堆叠注入 根据数据库类型决定是否支持多条语句执行 数据库支持多条语句执行就是堆叠&#xff0c;如&#xff1a; 2、数据库二次注入 应用功能逻辑涉及上导致的先写入后组合的注入 3、数据库Dnslog注入 解决不回显&#xff08;反向连接&#…

上生产时连接mysql数据库总是被拒绝

背景&#xff1a; 本地项目连接数据正常 测试环境也正常 到生产上就一直报错 且生产上使用mysql连接工具可以正常连接 报错信息&#xff1a;Connections refused: connect 调查&#xff1a; 数据库版本&#xff1a; 本地 mysql5.7.24 测试 8.3 生产5.7.36 连接驱动&#xf…