使用 PyTorch 的计算机视觉简介 (3/6)

news2025/1/12 5:53:18

一、说明

在本单元中,我们将了解卷积神经网络(CNN),它是专门为计算机视觉设计的。 卷积层允许我们从图像中提取某些图像模式,以便最终分类器基于这些特征。

二、卷积神经网络 

        计算机视觉不同于通用分类,因为当我们试图在图片中找到某个物体时,我们正在扫描图像以寻找一些特定的图案及其组合。比如在寻找猫的时候,我们首先可能会寻找水平线,可以形成胡须,然后一定的胡须组合可以告诉我们它实际上是猫的图片。某些图案的相对位置和存在很重要,而不是它们在图像上的确切位置。为了提取模式,我们将使用卷积过滤器的概念。但首先,让我们加载之前定义的所有依赖项和函数。

!wget https://raw.githubusercontent.com/MicrosoftDocs/pytorchfundamentals/main/computer-vision-pytorch/pytorchcv.py
import torch
import torch.nn as nn
import torchvision
import matplotlib.pyplot as plt
from torchinfo import summary
import numpy as np

from pytorchcv import load_mnist, train, plot_results, plot_convolution, display_dataset
load_mnist(batch_size=128)

三、卷积滤波器

        卷积滤波器是在图像的每个像素上运行并计算相邻像素的加权平均值的小窗口。它们由权重系数矩阵定义。

        让我们看看在 MNIST 手写数字上应用两个不同的卷积过滤器的示例:

plot_convolution(torch.tensor([[-1.,0.,1.],[-1.,0.,1.],[-1.,0.,1.]]),'Vertical edge filter')
plot_convolution(torch.tensor([[-1.,-1.,-1.],[0.,0.,0.],[1.,1.,1.]]),'Horizontal edge filter')

第一个过滤器称为垂直边缘过滤器,它定义为:

 -1 0 1
 -1 0 1 
 -1 0 1

        当此过滤器经过相对均匀的像素字段时,所有值的总和为 0。但是,当它在图像中遇到垂直边缘时,会产生高峰值。这就是为什么在上图中,您可以看到由高值和低值表示的垂直边缘,而水平边缘则平均化。

        当我们应用水平边缘滤波器时,会发生相反的事情,其中水平线被放大,垂直线被平均。

        如果我们将 3 × 3 滤镜应用于大小为 28 × 28 的图像 — 图像的大小将变为 26 × 26,因为过滤器不会超出图像边界。但是,在某些情况下,我们可能希望保持图像的大小相同,在这种情况下,图像每边都填充零。

        在经典的计算机视觉中,将多个过滤器应用于图像以生成特征,然后机器学习算法使用这些特征来构建分类器。然而,在深度学习中,我们构建的网络可以学习最佳的卷积过滤器来解决分类问题。

        为此,我们引入了卷积层。

四、卷积层

        卷积层使用 nn 定义。Conv2d 构造。我们需要指定以下内容:

  • in_channels — 输入通道数。在我们的例子中,我们正在处理灰度图像,因此输入通道的数量为1。彩色图像有 3 个通道 (RGB)。
  • out_channels — 要使用的过滤器数量。我们将使用 9 种不同的筛选器,这将为网络提供大量机会来探索哪些筛选器最适合我们的方案。
  • kernel_size是滑动窗口的大小。通常使用 3 个× 3 个或 5 个× 5 个过滤器。过滤器尺寸的选择通常通过实验选择,即通过尝试不同的过滤器尺寸并比较结果的准确性。

        最简单的CNN将包含一个卷积层。给定输入大小
        28 × 28,在应用 5 个 5 × 9 个过滤器后,我们最终将得到 24 × 24 × 24 的张量(空间大小较小,因为只有 5 个位置,长度为 28 的
滑动间隔可以容纳 9 像素)。在这里,每个滤波器的结果由图像中的不同通道表示。因此,第一维<>对应于滤波器的数量。

        卷积后,我们将 9 × 24 × 24 张量展平为一个大小为 5184 的向量,然后添加线性层,生成 10 个类。我们还在层之间使用 relu 激活函数。

class OneConv(nn.Module):
    def __init__(self):
        super(OneConv, self).__init__()
        self.conv = nn.Conv2d(in_channels=1,out_channels=9,kernel_size=(5,5))
        self.flatten = nn.Flatten()
        self.fc = nn.Linear(5184,10)

    def forward(self, x):
        x = nn.functional.relu(self.conv(x))
        x = self.flatten(x)
        x = nn.functional.log_softmax(self.fc(x),dim=1)
        return x

net = OneConv()

summary(net,input_size=(1,1,28,28))
==========================================================================================
Layer (type:depth-idx)                   Output Shape              Param #
==========================================================================================
├─Conv2d: 1-1                            [1, 9, 24, 24]            234
├─Flatten: 1-2                           [1, 5184]                 --
├─Linear: 1-3                            [1, 10]                   51,850
==========================================================================================
Total params: 52,084
Trainable params: 52,084
Non-trainable params: 0
Total mult-adds (M): 0.18
==========================================================================================
Input size (MB): 0.00
Forward/backward pass size (MB): 0.04
Params size (MB): 0.21
Estimated Total Size (MB): 0.25
==========================================================================================

        您可以看到,该网络包含大约 50k 的可训练参数,而在完全连接的多层网络中,则包含大约 80k 个参数。这使我们能够在较小的数据集上获得良好的结果,因为卷积网络的泛化效果要好得多。

        请注意,卷积层的参数数量非常少,并且不依赖于图像的分辨率!在我们的例子中,我们使用了 9 个维度为 5 × 5 的过滤器,因此参数的数量为
9 × 5 × 5 + 9 = 234。尽管我们在上面的讨论中错过了这一点,但卷积过滤器也有偏见。我们网络的大部分参数来自最终的密集层。

hist = train(net,train_loader,test_loader,epochs=5)
plot_results(hist)
Epoch  0, Train acc=0.947, Val acc=0.969, Train loss=0.001, Val loss=0.001
Epoch  1, Train acc=0.979, Val acc=0.975, Train loss=0.001, Val loss=0.001
Epoch  2, Train acc=0.985, Val acc=0.977, Train loss=0.000, Val loss=0.001
Epoch  3, Train acc=0.988, Val acc=0.975, Train loss=0.000, Val loss=0.001
Epoch  4, Train acc=0.988, Val acc=0.976, Train loss=0.000, Val loss=0.001

        如您所见,与以前的全连接网络相比,我们能够实现更高的精度和更快的速度。我们还可以可视化经过训练的卷积层的权重,以尝试更有意义地了解正在发生的事情:

fig,ax = plt.subplots(1,9)
with torch.no_grad():
    p = next(net.conv.parameters())
    for i,x in enumerate(p):
        ax[i].imshow(x.detach().cpu()[0,...])
        ax[i].axis('off')

        您可以看到其中一些过滤器看起来可以识别一些倾斜的笔划,而另一些则看起来非常随机。

五、小结

        卷积层允许我们从图像中提取某些图像模式,以便最终分类器基于这些特征。但是,我们可以使用相同的方法来提取特征空间内的模式,方法是在第一个卷积层之上堆叠另一个卷积层。我们将在下一个单元中学习多层卷积网络。

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

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

相关文章

虚拟机中window/ubuntu系统如何联网?

以下内容源于网络资源的学习与整理&#xff0c;如有侵权请告知删除。 参考博客 &#xff08;1&#xff09;VMware虚拟机中Windows11无法连接网络 &#xff08;2&#xff09;图解vmware虚拟机win8无线上网 &#xff08;3&#xff09;VMware中VMnet0、VMnet1、VMnet8是什么 &…

PyTorch深度学习(七)【循环神经网络-提高】

数据集文末分享。 模型&#xff1a; 做完padding之后&#xff0c;就可以转换为张量了。 bidirectional是是否使用双向RNN: 输出隐层两个&#xff1a; 代码&#xff1a; import csvimport timeimport matplotlib.pyplot as pltimport numpy as npimport mathimport gzip # 用…

巨人互动|Facebook海外户Facebook内容的类型

随着人们日益依赖的社交媒体来进行信息获取与交流&#xff0c;Facebook作为全球最大的社交媒体平台之一&#xff0c;那么Facebook的内容都有哪些类型呢&#xff1f;下面小编来讲讲吧&#xff01; 1、实时发生的事 我们需要实时了解时事动态&#xff0c;这样可以使用户对品牌发…

【网络层】IP协议

文章目录 IP协议1. 前提认识(1) IP的定位和作用(2) IP地址的构成(3) 基本概念 2. 协议头格式(1) 两个核心问题 3. 网段划分(重要)(1) 为什么要网段划分(2) 概念(3) 子网划分方案(4) 模拟子网划分 4. 特殊的IP地址5. IP地址的数量限制6. 私有IP地址和公网IP地址7. 路由及路由表(…

学习记忆——宫殿篇——记忆宫殿——记忆桩——火车+外院+客厅+卧室

护板 警示灯 烟筒 采集箱 司炉室 桥 电线杆 棚顶 车厢 护栏 植物 石阶 水泥台 竹门 树干 躺椅 柱子 墙 池 洞 方灯 枕头 树 浴池 墙 射灯 藤条 浴巾框 耳环 窗户 灯 沙发 壁炉 吊灯 兵马俑 门 石佛 沙发椅 圆木 弧形木箱盖 床 窗帘 画板 纸伞 花 沙发背 颜料 抽屉

Hadoop-sqoop

sqoop 1. Sqoop简介及原理 简介&#xff1a; Sqoop是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysq1.postgresql..)间进行数据的传递&#xff0c;可以将一个关系型数据库&#xff08;例如: MySQL ,Oracle ,Postgres等&#xff09;中的数据导进到Hadoop 的HDFS中&…

【AI视野·今日Robot 机器人论文速览 第三十七期】Wed, 20 Sep 2023

AI视野今日CS.Robotics 机器人学论文速览 Wed, 20 Sep 2023 Totally 53 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Robotics Papers Machine Learning-Driven Burrowing with a Snake-Like Robot Authors Sean Even, Holden Gordon, Hoeseok Yang, Yasemin Ozk…

《软件方法》第1章2023版连载(03)建模工作流

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 1.2 建模工作流 1.2.1 建模工作流ABCD 如何能做好需求和设计&#xff0c;达到“低成本制造好卖的系统”的目标&#xff1f;并非喊喊口号就可以&#xff0c;需要静下心来学习和实践一…

基于知识蒸馏的两阶段去雨去雪去雾模型学习记录(一)

前面完成了基于知识蒸馏的去雨去雪去雾模型大的部署与训练&#xff0c;下面则进行代码的学习。 使用debug的方式进行代码的学习。 首先是网络结构展示&#xff1a;轻易不要打开&#xff0c;这个模型太复杂了。说到底倒不是多复杂&#xff0c;就是层数太多了 Net((conv_input):…

玩玩“小藤”开发者套件 Atlas 200I DK A2 之VSCode远程连接

玩玩“小藤”开发者套件 Atlas 200I DK A2 之VSCode远程连接 0. 背景1. VSCode 安装 Remote - SSH 插件2. 安装 OpenSSH 组件3. VSCode SSH 连接 Atlas 200I DK A24. 打开远程文件夹 0. 背景 总所周知&#xff0c;英伟达的GPU供不应求&#xff0c;还各种限制。华为推出了升腾A…

ChatGLM2-6B 部署与微调

文章目录 一、ChatGLM-6B二、ChatGLM2-6B三、本地部署ChatGLM2-6B3.1 命令行模式3.2 网页版部署3.3 本地加载模型权重3.4 模型量化3.5 CPU部署3.6 多卡部署 四、P-tuning v2微调教程4.1 P-tuning v2 原理4.2 P-tuning v2微调实现4.2.1 安装依赖&#xff0c;下载数据集4.2.2 开始…

好题记录 Leetcode 394.字符串解码 中等难度

方法一&#xff1a;递归 思路很简单&#xff0c;比较好理解&#xff0c;注意细节处理&#xff01;&#xff01;&#xff01; class Solution { public:string decodeString(string s) {string ans;for(int i0;s[i]!0;i){if(s[i]>a&&s[i]<z)anss[i];if(s[i]>…

CentOS 7系统安装与配置、常用100条操作命令

CentOS 7 是一个广泛使用的开源 Linux 操作系统&#xff0c;它是 Red Hat Enterprise Linux (RHEL) 的一个免费重建版本&#xff0c;以稳定性和安全性而著称。在 CentOS 7 上安装虚拟机通常使用虚拟化技术&#xff0c;如 VirtualBox 或 VMware 等。以下是 CentOS 7 的简要介绍以…

外国固定资产管理系统功能有哪些

很多公司都在寻找提高自己资产管理效益的方法。为了满足这一要求&#xff0c;国外的固定资产管理系统已经发展成多种形式。以下是国外一些常见的固定资产管理系统的特点:自动化和智能化:许多现代固定资产管理系统采用自动化和数字化技术&#xff0c;以简化流程&#xff0c;减少…

使用vue-cli搭建SPA项目及使用和路由及路由嵌套的使用

目录 一、介绍 ( 1 ) 概述 ( 2 ) 作用 二、项目搭建 SPA介绍 讲述 特点 优点 ( 1 ) 检查 ( 2 ) 安装 ( 3 ) 构建 ( 4 ) 启动 ( 5 ) 导入 三、路由及嵌套使用 ( 1 ) 路由 ( 2 ) 嵌套 给我们的收获 一、介绍 ( 1 ) 概述 vue-cli是一个基于Vue.js的脚…

Next.js项目初始化(附gitHub地址)

Next.js项目初始化 1.脚手架搭建 npx create-next-applatest 生成目录&#xff1a; 我生成的package.json: {"name": "nest-initial-demo","version": "0.1.0","private": true,"scripts": {"dev": …

基于微信小程序的医院挂号预约系统设计与实现(源码+lw+部署文档+讲解等)

前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f447;&#x1f3fb;…

智能配电系统:保障电力运行安全、可控与高效

智能配电系统是一种先进的电力分配技术&#xff0c;它通过智能化、数字化和网络化等方式&#xff0c;有效地保障了电力运行的安全、可控和高效。 力安科技智能配电系统是在配电室&#xff08;含高压柜、变压器、低压柜&#xff09;、箱式变电站、配电箱及动力柜&#xff08…

jvm垃圾收集算法

简介 由于《分代收集理论》和不同垃圾收集算法&#xff0c;Java堆会被划分为不同区域&#xff0c;一般至少会把Java堆划分为新生代&#xff08;Young Generation&#xff09;和老年代&#xff08;Old Generation&#xff09;两个区域。 垃圾收集器可以只回收其中某一个或者某…

爬虫 — App 爬虫(二)

目录 一、Appium介绍二、node.js 安装三、Java 的 SDK 安装以及配置1、安装步骤2、配置环境变量 四、安卓环境的配置1、配置环境变量 五、Appium 安装1、安装2、打开 APP3、使用 六、Appium 使用1、定位数据&#xff08;方法一&#xff0c;不常用&#xff09;2、定位数据&#…