认识卷积神经网络

我们现在开始了解卷积神经网络,卷积神经网络是深度学习在计算机视觉领域的突破性成果,在计算机视觉领域,往往我们输入的图像都很大,使用全连接网络的话,计算的代价较高,图像也很难保留原有的特征,导致图像处理的准确率不高。

CNN 

卷积神经网络(Convolutional Neural Networks,简称CNN)是一种特殊类型的神经网络,特别适合于处理具有网格结构的数据,如图像和视频。CNN的设计灵感来源于生物视觉系统,特别是大脑视觉皮层对视觉信息的处理方式。

关键组件:

  1. 卷积层(Convolutional Layer):这是CNN的核心,使用一组可学习的滤波器(或称卷积核)扫描输入数据,以检测特定特征,如边缘、纹理等。滤波器的移动步长(stride)和填充(padding)是可以调整的参数,以控制输出特征图的尺寸。

  2. 激活函数(Activation Function):如ReLU(Rectified Linear Unit)等,为网络引入非线性,使得模型能学习复杂的模式。

  3. 池化层(Pooling Layer):通常紧随卷积层之后,用于降低数据的空间维度,减少计算量,同时保持重要特征不变,常见的有最大池化(Max Pooling)。

  4. 全连接层(Fully Connected Layer):位于网络的较深层,所有特征被整合并用于最终的分类或回归任务。

图像 

图像是由像素点组成的,每个像素点的值范围为: [0, 255]

  • 0 表示最暗的黑色,即没有光亮。
  • 255 表示最亮的白色,即光亮度最大。

我们看到的彩色图一般都是多通道的图像, 所谓多通道可以理解为图像由多个不同的图像层叠加而成,最常见的RGB彩色图像由三个通道组成——红色、绿色、蓝色,每个通道都有自己的像素值(也是0到255的范围),三者的组合可以表示出数百万种不同的颜色。

我们通过一个简单的例子来使用Python的matplotlib库来加载并显示一张图像,进而理解像素和通道的概念。

from PIL import Image
import matplotlib.pyplot as plt# 加载图像
image_path = 'your_image_path.jpg'  # 替换为你的图片路径
img_pil = Image.open(image_path)# 使用matplotlib显示图像
plt.figure(figsize=(8, 8))  # 设置显示窗口大小
plt.imshow(img_pil)  # 显示图像# 如果是RGB图像,可以分离通道查看
if img_pil.mode == 'RGB':r, g, b = img_pil.split()plt.figure(figsize=(8, 8))plt.imshow(r, cmap='Reds')  # 显示红色通道plt.figure(figsize=(8, 8))plt.imshow(g, cmap='Greens')  # 显示绿色通道plt.figure(figsize=(8, 8))plt.imshow(b, cmap='Blues')  # 显示蓝色通道plt.show()  # 显示所有图像窗口

卷积层

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

卷积核

  • 卷积核是一个小型矩阵,通常尺寸较小,如3x3或5x5,也有其他尺寸如7x7或更大。每个元素代表权重,用于与输入图像(或前一层的特征图)的对应部分相乘。
  • 卷积核的大小、深度(即通道数)必须与输入数据的深度匹配。例如,处理RGB图像时,卷积核也应有3个通道,分别对应红、绿、蓝通道。

计算步骤: 

  1. 对齐: 首先,将卷积核与输入数据的某个区域精确对齐。对齐的起始点可以是从输入数据的左上角开始。

  2. 点乘与求和: 对于卷积核覆盖的每个位置,将卷积核的每个元素与输入数据对应位置的元素进行逐元素相乘,然后将所有乘积相加得到一个标量值。这个过程称为内积或点积。

  3. 滑动与重复: 完成一次点乘求和后,卷积核按照预定的步长(stride)在输入数据上水平或垂直滑动到下一个位置,重复上述计算过程。步长决定了卷积核每次移动的距离。

  4. 边缘处理: 为了处理边缘问题,可以在输入数据的边缘周围添加一圈或几圈零值,这个过程称为填充(padding)。填充可以保持输出特征图的尺寸或者增加尺寸。

  5. 输出特征图: 经过上述操作,每个卷积核在输入数据上滑动并计算后,会生成一个新的二维矩阵,称为特征图(Feature Map),表示了输入数据在该卷积核下的响应强度分布。

PyTorch 卷积层 API 

import torch
import torch.nn as nn
import matplotlib.pyplot as plt# 显示图像
def show(img):# 输入形状: (Height, Width, Channel)plt.imshow(img)plt.axis('off')plt.show()# 1. 单个多通道卷积核
def test01():# 读取图像, 形状: (640, 640, 4)img = plt.imread('data/彩色图片.png')show(img)# 构建卷积层# 由于 out_channels 为 1, 相当于只有一个4通道卷积核conv = nn.Conv2d(in_channels=4, out_channels=1, kernel_size=3, stride=1, padding=1)# 输入形状: (BatchSize, Channel, Height, Width)# mg形状: torch.Size([4, 640, 640])img = torch.tensor(img).permute(2, 0, 1)# img 形状: torch.Size([1, 4, 640, 640])img = img.unsqueeze(0)# 输入卷积层, new_img 形状: torch.Size([1, 1, 640, 640])new_img = conv(img)# new_img 形状: torch.Size([640, 640, 1])new_img = new_img.squeeze(0).permute(1, 2, 0)show(new_img.detach().numpy())# 2. 多个多通道卷积核
def test02():# 读取图像, 形状: (640, 640, 4)img = plt.imread('data/彩色图片.png')show(img)# 构建卷积层# 由于 out_channels 为 3, 相当于只有 3 个4通道卷积核conv = nn.Conv2d(in_channels=4, out_channels=3, kernel_size=3, stride=1, padding=1)# 输入形状: (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)# 输入卷积层, new_img 形状: torch.Size([1, 3, 640, 640])new_img = conv(img)# new_img 形状: torch.Size([640, 640, 3])new_img = new_img.squeeze(0).permute(1, 2, 0)# 打印三个特征图show(new_img[:, :, 0].unsqueeze(2).detach().numpy())show(new_img[:, :, 1].unsqueeze(2).detach().numpy())show(new_img[:, :, 2].unsqueeze(2).detach().numpy())

池化层

池化层(Pooling Layer)在卷积神经网络(CNN)中紧随卷积层之后,其主要目的是降低特征图的空间维度,减少计算量,同时保持或提炼重要的特征信息。

最常见的池化类型有两种:

  • 最大池化(Max Pooling):在池化窗口内取最大值作为输出。
  • 平均池化(Average Pooling):在池化窗口内取所有值的平均值作为输出。

计算过程

  1. 初始化: 确定池化窗口大小、步幅和输入特征图尺寸。
  2. 窗口滑动: 从输入特征图的左上角开始,窗口按照步幅S逐行逐列地滑动。
  3. 计算输出: 对于窗口覆盖的每个区域:
    • 如果是最大池化,选择窗口内最大的元素作为输出值。
    • 如果是平均池化,计算窗口内所有元素的平均值作为输出值。
  4. 构建输出特征图: 将每个窗口计算出的输出值按照窗口滑动的位置放置在输出特征图上,最终形成一个维度减小的特征图。

边缘处理

与卷积层类似,池化层也可以通过添加边界填充(padding)来处理边缘,但实践中通常较少使用,因为池化的目的是降维而非保持尺寸不变。

PyTorch 池化 API 使用

在PyTorch中,使用池化层主要通过torch.nn模块中的类来实现,比如nn.MaxPool2d用于最大池化,nn.AvgPool2d用于平均池化,以及nn.AdaptiveMaxPool2dnn.AdaptiveAvgPool2d用于自适应池化。

最大池化 (Max Pooling)

import torch
import torch.nn as nn# 创建一个最大池化层实例
max_pool = nn.MaxPool2d(kernel_size=2, stride=2)  # 核大小为2x2,步长也为2# 假设我们有一个张量作为输入,形状为(batch_size, channels, height, width)
input_tensor = torch.randn(1, 3, 32, 32)  # 例如,一个批次、3个通道、32x32大小的图像# 通过池化层传递输入张量
output_tensor = max_pool(input_tensor)print("Output shape:", output_tensor.shape)  # 输出张量的形状会根据池化核大小和步长变化

平均池化 (Average Pooling)

avg_pool = nn.AvgPool2d(kernel_size=2, stride=2)  # 同样的核大小和步长设置output_tensor_avg = avg_pool(input_tensor)
print("Average Pool Output shape:", output_tensor_avg.shape)

自适应池化 (Adaptive Pooling)

adaptive_max_pool = nn.AdaptiveMaxPool2d(output_size=(8, 8))  # 输出尺寸为8x8output_adaptive_max = adaptive_max_pool(input_tensor)
print("Adaptive Max Pool Output shape:", output_adaptive_max.shape)adaptive_avg_pool = nn.AdaptiveAvgPool2d(output_size=(8, 8))output_adaptive_avg = adaptive_avg_pool(input_tensor)
print("Adaptive Avg Pool Output shape:", output_adaptive_avg.shape)

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

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

相关文章

如何在windows server下安装mysql5.7数据库,并使用Navicat Premium 15可视化工具新建数据库并读取数据库信息。

如何在windows server下安装mysql5.7数据库? MySQL :: Download MySQL Community Server (Archived Versions)https://downloads.mysql.com/archives/community/点击↑,然后选择对应版本和平台↓下载 将下载后的安装包放入固定目录(这里以D:…

最大子矩阵:前缀和、动态规划

最近在学习动态规划,在牛客上刷题时碰到了这一题。其实最初的想法是暴力和前缀和,但是时间复杂度极高,需要套4层循环。后来去网上搜了一下相关的题解和做法,进而了解到了前缀和+线性动态规划的做法。但是在成功做出这题…

带头单链表 C++实现

节点定义 带头单链表&#xff1a;我们只需要一个结点指针指向整个链表的第一个节点&#xff0c;这样我们就可以通过next指针访问整个链表内的所有节点 template<class T> struct ListNode {T _val;ListNode* _next;ListNode(const T &val):_val(val),_next(nullptr){…

开发组合php+mysql 人才招聘小程序源码搭建 招聘平台系统源码+详细图文搭建部署教程

随着互联网的快速发展&#xff0c;传统的招聘方式已经不能满足企业和求职者的需求。为了提高招聘效率&#xff0c;降低招聘成本&#xff0c;越来越多的人开始关注人才招聘小程序、在线招聘平台。分享一个人才招聘小程序源码及搭建&#xff0c;让招聘更加高效便捷。系统是运营级…

【算法】滑动窗口——串联所有单词的子串

今天来以“滑动窗口”的思想来详解一道比较困难的题目——串联所有单词的子串&#xff0c;有需要借鉴即可。 目录 1.题目2.下面是示例代码3.总结 1.题目 题目链接&#xff1a;LINK 这道题如果把每个字符串看成一个字母&#xff0c;就是另外一道中等难度的题目&#xff0c;即&…

2022——蓝桥杯十三届2022国赛大学B组真题

问题分析 看到这个问题的同学很容易想到用十层循环暴力计算&#xff0c;反正是道填空题&#xff0c;一直算总能算得出来的&#xff0c;还有些同学可能觉得十层循环太恐怖了&#xff0c;写成回溯更简洁一点。像下面这样 #include <bits/stdc.h> using namespace std; in…

用 Supabase CLI 进行本地开发环境搭建

文章目录 &#xff08;零&#xff09;前言&#xff08;一&#xff09;Supabase CLI&#xff08;1.1&#xff09;安装 Scoop&#xff08;1.2&#xff09;用 Scoop 安装 Supabase CLI &#xff08;二&#xff09;本地项目环境&#xff08;2.1&#xff09;初始化项目&#xff08;2…

C++ | Leetcode C++题解之第86题分隔链表

题目&#xff1a; 题解&#xff1a; class Solution { public:ListNode* partition(ListNode* head, int x) {ListNode* small new ListNode(0);ListNode* smallHead small;ListNode* large new ListNode(0);ListNode* largeHead large;while (head ! nullptr) {if (head-…

Spring STOMP-消息处理流程

一旦STOMP的接口被公布&#xff0c;Spring应用程序就成为连接客户端的STOMP代理。本节描述服务端消息处理的流程。 spring-messaging模块包含消息类应用的基础功能&#xff0c;这些功能起源于Spring Integration项目。并且&#xff0c;后来被提取整合到Spring框架&#xff0c;…

Zookeeper 注册中心:单机部署

序言 本文给大家介绍 Zookeeper 单机部署流程、 如何与 Spring 整合使用。除此之外&#xff0c;还有 Zookeeper 作为注册中心与 SpringCloud 的整合流程。 一、部署流程 官网下载 Zookeeper 安装包 解压安装包到指定目录 进入 apache-zookeeper-3.8.4-bin/conf 目录&…

目标检测——印度车辆数据集

引言 亲爱的读者们&#xff0c;您是否在寻找某个特定的数据集&#xff0c;用于研究或项目实践&#xff1f;欢迎您在评论区留言&#xff0c;或者通过公众号私信告诉我&#xff0c;您想要的数据集的类型主题。小编会竭尽全力为您寻找&#xff0c;并在找到后第一时间与您分享。 …

《C++学习笔记---初阶篇6》---string类 上

目录 1. 为什么要学习string类 1.1 C语言中的字符串 2. 标准库中的string类 2.1 string类(了解) 2.2 string类的常用接口说明 2.2.1. string类对象的常见构造 2.2.2. string类对象的容量操作 2.2.3.再次探讨reserve与resize 2.2.4.string类对象的访问及遍历操作 2.2.5…

【Spring】验证 @ServerEndpoint 的类成员变量线程安全

文章目录 前言猜想来源验证方法Controller 的情况ServerEndpoint 的情况 后记 前言 最近有 websocket 的需求。探索 ServerEndpoint 的类成员变量特点。 这里类比 Controller 讨论 ServerEndpoint 类成员变量是否线程安全。 猜想来源 网上的教程大多数都这么展示程序&#…

OBS插件--音频采集

音频采集 音频采集是一款 源 插件,类似于OBS的win-capture/game-capture&#xff0c;允许从特定应用程序捕获音频&#xff0c;而不是捕获整个系统的音频。避免了因为特定音频的采集而需要引入第三方软件&#xff0c;而且时延也非常低。 下面截图演示下操作步骤&#xff1a; 首…

简单的Python HTML 输出

1、问题背景 一名初学者在尝试将 Python 脚本输出到网页上时遇到了一些问题。他当前使用 Python 和 HTML 进行开发&#xff0c;并且遇到了以下问题&#xff1a; 担心自己的代码过于复杂&#xff0c;尤其是 WebOutput() 函数。希望通过 JavaScript 使用 HTML 模板文件更新数据。…

几个字符串函数的使用和模拟实现(2)

strcop的使用和模拟实现 strcpy函数的使用事项&#xff1a; 源字符串时不需要修改的&#xff0c;在定义前加上const 源字符串被拷贝到目标字符串上时终止字符\0也被拷贝进去 目标数组的大小要相对于源数组的大小足够大&#xff0c;并且不应该在内存中重叠 函数的返回值是一个字…

网络无线网卡无法配置正确的 dns 服务器

网络无线网卡无法配置正确的 dns 服务器--解决办法 网络无线网卡无法配置正确的 dns 服务器--解决办法 网络无线网卡无法配置正确的 dns 服务器–解决办法 建议先使用疑难反馈&#xff08;自带的&#xff09; 打开网络适配中心 之后更改适配器设置&#xff0c;在点击 wlan 属…

绿盟之旅——一段安全实习结束

去年&#xff0c;因为着急找实习&#xff0c;拿着简历就开始海投&#xff0c;当时想的是有人让我去就谢天谢地了&#xff0c;第一个约我面试的就是绿盟&#xff0c;也很顺利的通过了面试&#xff0c;当时让我选择在上海还是北京&#xff0c;我选择的是上海&#xff0c;因为学校…

【C++】set 和 map 学习及使用

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《C》 《Linux》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 前言 set 和 map 是 STL 中的容器之一&#xff0c;不同于普通容器&#xff0c;它俩的查找速度极快…

开发一款相亲交友小程序

uni-app框架&#xff1a;使用Vue.js开发跨平台应用的前端框架&#xff0c;编写一套代码&#xff0c;可编译到Android、小程序等平台。 框架支持:springboot/Ssm/thinkphp/django/flask/express均支持 前端开发:vue.js 可选语言&#xff1a;pythonjavanode.jsphp均支持 运行软件…