认识卷积神经网络

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

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))  # 输出尺寸为8x8

output_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.mfbz.cn/a/607811.html

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

相关文章

oracle 数据库找到UDUMP的文件名称

oracle 数据库找到UDUMP的文件名称 select p.value||\||i.instance_name||_ora_||spid||.trc as "trace_file_name" from v$parameter p ,v$process pro, v$session s, (select sid from v$mystat where rownum1) m, v$instance i where lower(p.name)user_dump_…

Java_File

介绍: File对象表示路径,可以是文件,也可以是文件夹。这个路径可以是存在的,也可以是不存在的,带盘符的路径是绝对路径,不带盘符的路径是相对路径,相对路径默认到当前项目下去找 构造方法&…

英伟达推出视觉语言模型:VILA

NVIDIA和MIT的研究人员推出了一种新的视觉语言模型(VLM)预训练框架,名为VILA。这个框架旨在通过有效的嵌入对齐和动态神经网络架构,改进语言模型的视觉和文本的学习能力。VILA通过在大规模数据集如Coy0-700m上进行预训练,采用基于LLaVA模型的…

三.Django--ORM(操作数据库)

目录 1 什么是ORM 1.1 ORM优势 1.2ORM 劣势 1.3 ORM与数据库的关系 2 ORM 2.1 作用 2.2 连接数据库 2.3 表操作--设置字段 2.4 数据库的迁移 写路由增删改查操作 项目里的urls.py: app里的views.py: 注意点: 1 什么是ORM ORM中文---对象-关系映射 在MTV,MVC设计…

2024面试自动化测试面试题【含答案】

🔥 交流讨论:欢迎加入我们一起学习! 🔥 资源分享:耗时200小时精选的「软件测试」资料包 🔥 教程推荐:火遍全网的《软件测试》教程 📢欢迎点赞 👍 收藏 ⭐留言 &#x1…

若依框架dialog弹窗取消点击空白出关闭

如果想全局取消的话就找到main.js在里面加上下面的一行代码,添加完成之后记得清楚浏览器缓存重新加载js文件。 Element.Dialog.props.closeOnClickModal.default false;如果想指定某个弹窗取消点击空白处关闭,那么就找到那个弹窗加上。添加完毕之后刷新…

扩散模型~

推荐:write_own_pipeline.ipynb - Colab (google.com) 基本管道 一直显示NVIDIA有问题,所以就把.to("cuda")去掉了,使用Colab运行的,代码如下: from diffusers import DDPMPipelineddpm DDPMPipeline.fr…

哈希题目总结

以下列举了可以用哈希方法(包括但不限于用HashMap和HashSet)的题目,实质上是把东西丢给这些数据结构去维护。请注意有些题目中用哈希是最优解,有些题目中不是最优解,可以自行探索其时间复杂度和空间复杂度的区别&#…

java入门1.1.1版本

前言: 上面的内容是1.0.0~1.1的内容总结 秉持着先做再定义的理念,这里会带着大家先体验一下类与对象 第一步:新建一个java文件 鼠标右键 → 新建 → 文本文档 → 右键 → 点击重名 → 全选 → hello.java 第二步:用笔记本打开 …

阿里云开发uniapp之uni-starter

一、为什么使用uni-starter uni-starter是集成商用项目常见功能的、云端一体应用快速开发项目模版。 一个应用有很多通用的功能,比如登录注册、个人中心、设置、权限管理、拦截器、banner... uni-starter将这些功能都已经集成好,另外,uni-s…

2023-2024年SaaS行业报告合集(精选22份)

SaaS行业报告/方案(精选21份) 2023-2024年 报告来源:2023-2024年SaaS行业报告合集(精选22份) 【以下是资料目录】 2024中国HCM SaaS领导者竞争力持续增强的行业龙头 2024年中国企业级SaaS行业研究报告 2024年SaaS…

基于Transformer网络的多步预测模型

包括完整流程数据代码处理: 多步预测数据集制作、数据加载、模型定义、参数设置、模型训练、模型测试、预测可视化、多步预测、模型评估 ● 环境框架:python 3.9 pytorch 1.8 及其以上版本均可运行 ● 使用对象:论文需求、毕业设计需求者…

Offer必备算法37_记忆化搜索_五道力扣题详解(由易到难)

目录 记忆化搜索概念和使用场景 ①力扣509. 斐波那契数 解析代码1_循环 解析代码2_暴搜递归 解析代码3_记忆化搜索 解析代码4_动态规划 ②力扣62. 不同路径 解析代码1_暴搜递归(超时) 解析代码2_记忆化搜索 解析代码3_动态规划 ③力扣300. 最…

最详尽的网络安全学习路线!涵盖所有技能点,带你成为网安专家!

目录 零基础小白,到就业!入门到入土的网安学习路线! 建议的学习顺序: 一、夯实一下基础,梳理和复习 二、HTML与JAVASCRIPT(了解一下语法即可,要求不高) 三、PHP入门 四、MYSQL…

QX-mini51单片机学习---(4)蜂鸣器

目录 1蜂鸣器工作原理 2三极管工作原理 3本节相关原理图分析 4实践 1蜂鸣器工作原理 2三极管工作原理 我们这里使用PNP三极管,低电压导通 做开关 PNP E(emitrer):发射极,B(base)&#x…

leetcode每日一题第七十二天

class Solution { public:TreeNode* searchBST(TreeNode* root, int val) {if(!root) return root;if(root->val val) return root;else if(root->val > val) return searchBST(root->left,val);else return searchBST(root->right,val);} };

WPF中页面加载时由于TreeView页面卡顿

示例&#xff1a;右侧界面的数据根据左侧TreeView的选项加载不同的数据&#xff0c;页面加载时会把所有的数据加载一遍&#xff0c;导致页面卡顿。 解决办法&#xff1a; <Setter Property"IsSelected" Value"{Binding IsSelected}"/>

初学python记录:力扣1652. 拆炸弹

题目&#xff1a; 你有一个炸弹需要拆除&#xff0c;时间紧迫&#xff01;你的情报员会给你一个长度为 n 的 循环 数组 code 以及一个密钥 k 。 为了获得正确的密码&#xff0c;你需要替换掉每一个数字。所有数字会 同时 被替换。 如果 k > 0 &#xff0c;将第 i 个数字用…

车载测试到底怎么样?真实揭秘!

什么是车载智能系统测试&#xff1f; 车载智能系统&#xff0c;是汽车智能化重要的组成部分&#xff0c;由旧有的车载资通讯系统结合联网汽车技术所演进而来&#xff0c;随着软硬件技术的不断进步&#xff0c; 让车载智能系统拥有强大的运算能力及多元化的应用功能。 车载智能…

FreeRTOS学习 -- 任务相关API函数

一、任务创建和删除API函数 FreeRTOS 最基本的功能就是任务管理&#xff0c;而任务管理最基本的操作就是创建和删除任务。 FreeRTOS的任务创建和删除API函数如下&#xff1a; 1、函数 xTaskCreate() 此函数用来创建一个任务&#xff0c;任务需要 RAM 来保存于任务有关的状…
最新文章