六、卷积神经网络(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 plt

def 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 nn

def 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 nn

def 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.]]])
"""

总结

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vscode写markdown快速插入python代码

如图当我按下快捷键CRTLSHIFTK 自动出现python代码片段 配置方法shortcuts’ 打开这个json文件 输入 {"key": "ctrlshiftk","command": "editor.action.insertSnippet","when": "editorTextFocus","args&…

Java NIO 核心知识总结

在学习 NIO 之前,需要先了解一下计算机 I/O 模型的基础理论知识。还不了解的话,可以参考我写的这篇文章:Java IO 模型详解。 一、NIO 简介 在传统的 Java I/O 模型(BIO)中,I/O 操作是以阻塞的方式进行的。…

vscode 远程连接ssh 密钥方式

目录 1. powershell 生成key: 2. 在服务器上安装公钥 3).为了确保连接成功,输入如下指令以保证以下文件权限正确: 3 开启 ssh 密钥登录 vscode 远程连接配置 python连接 1. powershell 生成key: 在命令行执行ssh-keygen来创…

web——upload-labs——第十一关——黑名单验证,双写绕过

还是查看源码, $file_name str_ireplace($deny_ext,"", $file_name); 该语句的作用是:从 $file_name 中去除所有出现在 $deny_ext 数组中的元素,替换为空字符串(即删除这些元素)。str_ireplace() 在处理时…

vue中mixin(混入)的使用

目录 mixin(混入) 使用方式 第一步定义混合 ​编辑 第二步使用混入 局部混入 全局混合 mixin(混入) 功能:可以把多个组件共用的配置提取成一个混入对象 使用方式 第一步定义混合 { data(){....}, methods:{....} .... } 第二步使用混入 …

Block Successive Upper Bound Minimization Method(BSUM)算法

BSUM优化方法学习 先验知识参考资料1 A Unified Convergence Analysis of Block Successive Minimization Methods for Nonsmooth OptimizationSUCCESSIVE UPPER-BOUND MINIMIZATION (SUM) 连续上限最小化算法THE BLOCK SUCCESSIVE UPPER-BOUND MINIMIZATION ALGORITHM 块连续上…

[STM32]从零开始的STM32 HAL库环境搭建

一、前言 之前在搭建STM32的标准库环境时就告诉过大家,开发STM32的方式主要有三种。一种是最原始但是效率最高的寄存器开发,另一种是效率仅次于寄存器难度相对较低的标准库开发,最后一种是最为简单但是程序效率最低的HAL库开发。如果对于初学…

【论文笔记】Large Brain Model (LaBraM, ICLR 2024)

Code: https://github.com/935963004/LaBraM Data: 无 目录 AbstractIntroductionMethodNeural tokenizer training:Pre-training LaBraM: ResultsExperimental setup:Pre-training result:Comparison with SOTA:Pre-t…

AnythingLLM - 任何文档资源内容转换为任何LLM

更多AI开源软件: AI开源 - 小众AIhttps://www.aiinn.cn/sources 一个全栈应用程序,使您能够将任何文档、资源或内容转换为任何 LLM 都可以在聊天期间用作参考的上下文。此应用程序允许您选择要使用的 LLM 或矢量数据库,并支持多用户管理和权…

PDF内容提取,MinerU使用

准备环境 # python 3.10 python3 -m pip install huggingface_hub python3 -m pip install modelscope python3 -m pip install -U magic-pdf[full] --extra-index-url https://wheels.myhloli.com下载需要的模型 import json import osimport requests from huggingface_hub…

【阅读记录-章节3】Build a Large Language Model (From Scratch)

目录 3 Coding attention mechanisms3.1 The problem with modeling long sequences背景:注意力机制的动机 3.2 Capturing data dependencies with attention mechanismsRNN的局限性与改进Transformer架构的革命 3.3 Attending to different parts of the input wit…

Kubernetes配置管理ConfigMap、Secret

Your burden will become a gift, and your suffering will light your way. 应用部署的一个最佳实践是将应用所需的配置信息与程序分离,这样可以使应用程序被更好地复用,通过不同的配置也能实现更灵活的功能。将应用打包为容器镜像后,可以通过环境变量或者外挂文件的方式在…

141. Sprite标签(Canvas作为贴图)

上节课案例创建标签的方式,是把一张图片作为Sprite精灵模型的颜色贴图,本节给大家演示把Canvas画布作为Sprite精灵模型的颜色贴图,实现一个标签。 注意:本节课主要是技术方案讲解,默认你有Canvas基础,如果没有Canvas基…

「OpenCV交叉编译」ubuntu to arm64

Ubuntu x86_64 交叉编译OpenCV 为 arm64OpenCV4.5.5、cmake version 3.16.3交叉编译器 gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu 可在arm或linaro官网下载所需版本,本文的交叉编译器可点击链接跳转下载 Downloads | GNU-A Downloads – Arm Developer L…

鸿蒙网络编程系列48-仓颉版UDP回声服务器示例

1. UDP回声服务器简介 回声服务器指的是这样一种服务器,它接受客户端的连接,并且把收到的数据原样返回给客户端,本系列的第2篇文章《鸿蒙网络编程系列2-UDP回声服务器的实现》中基于ArkTS语言在API 9的环境下实现了UDP回声服务器&#xff0c…

【WPF】Prism学习(七)

Prism Dependency Injection 1.注册类型(Registering Types) 1.1. Prism中的服务生命周期: Transient(瞬态):每次请求服务或类型时,都会获得一个新的实例。Singleton(单例&#xf…

springboot基于Hadoop的NBA球员大数据分析与可视化(1)(6)

摘 要 科学技术日新月异,人们的生活都发生了翻天覆地的变化,NBA球员大数据分析与可视化系统当然也不例外。过去的信息管理都使用传统的方式实行,既花费了时间,又浪费了精力。在信息如此发达的今天,可以通过网络这个媒…

Q3净利增长超预期,文心大模型调用量大增,百度未来如何分析?

首先,从百度发布的2024年第三季度财务报告来看,其净利润同比增长17%,超出了市场预期,显示出百度整体财务表现的强劲。这一增长不仅体现在总营收和百度核心营收上,更具体地反映在归属百度核心的净利润上,这标…

Vscode/Code-server无网环境安装通义灵码

Date: 2024-11-18 参考材料:https://help.aliyun.com/zh/lingma/user-guide/individual-edition-login-tongyi-lingma?spma2c4g.11186623.0.i0 1. 首先在vscode/code-server插件市场中安装通义插件,这步就不细说了。如果服务器没网,会问你要…

开源TTS语音克隆神器GPT-SoVITS_V2版本地整合包部署与远程使用生成音频

文章目录 前言1.GPT-SoVITS V2下载2.本地运行GPT-SoVITS V23.简单使用演示4.安装内网穿透工具4.1 创建远程连接公网地址 5. 固定远程访问公网地址 前言 本文主要介绍如何在Windows系统电脑使用整合包一键部署开源TTS语音克隆神器GPT-SoVITS,并结合cpolar内网穿透工…