CNN 卷积神经网络处理图片任务 | PyTorch 深度学习实战

前一篇文章,学习率调整策略 | PyTorch 深度学习实战

本系列文章 GitHub Repo: https://github.com/hailiang-wang/pytorch-get-started

CNN 卷积神经网络

  • CNN
    • 什么是卷积
    • 工作原理
      • 深度学习的卷积运算
      • 提取特征
      • 不同特征核的效果比较
      • 卷积核
      • 感受野
      • 共享权重
      • 池化
    • 示例源码
  • Links

CNN

什么是卷积

【通信原理 入坑之路】——深入、详细地理解通信里面“卷积”概念

卷积,首先是一种数学运算。两个多项式通过滑动,求解多项式参数。

在这里插入图片描述
深度学习的卷积概念,就是借鉴了通信领域使用了卷积。跨学科运用知识,一直是大牛们的惯用手段。掌握人类已经精通的领域的经验,然后推广到前沿领域。

工作原理

利用卷积操作实现平移、扭曲情况下,依然能识别特征

图片是一个二维数据,如果只是利用全连接网络,那么数据的二维特征就丢失了,原始的物理信息丢失了。比如,同一个人出现在不同的照片中,很可能是在不同的位置,作为同样的一张人脸,当其出现在图片中的不同位置1,都可以正确的识别和分类呢?

深度学习的卷积运算

深度学习领域的卷积,参考文章。

卷积核是一个小矩阵,在输入矩阵上,滑动。
在这里插入图片描述

最终得到一个新的 output 矩阵。
在这里插入图片描述

提取特征

因为这种运算,Output 实际上代表了卷积核 Kernel 作用于 Input 后过滤出来的特征。每一个卷积核,就是一个过滤器,从源图片中,提取特定的形状。为了理解这一点,看下面这张图。

在这里插入图片描述

以黑白两个颜色,实现卷积运算,最终输入图片里和特征核(Single filter)重叠的部分得到了加强,和特征核不一致的部分得到了抑制。

不同特征核的效果比较

当特征核变大,增加多个特征提取器,那么就可以识别一张图片上的特征组,从而判定图片中包含的物体的分类。

  • 左侧是运算符,中间是对应的特征核,右侧是输出的图片

在这里插入图片描述
在这里插入图片描述
当然,计算机不是【看图】,而是通过卷积后的矩阵,从数字上去检查分类。当输出的矩阵组成一个全连接,使用目标的标注数据,计算出损失,就可以学习分类的权重,实现分类的效果。

卷积核

卷积核,也称为特征提取器,后者的名字更加的形象,特征提取器类似于通信领域的滤波器。

感受野

感受野(Receptive Field)的定义是卷积神经网络每一层输出的特征图(feature map)上的像素点在输入图片上映射的区域大小。参考文章

在这里插入图片描述

共享权重

使用同一个特征核过滤图片,也就是一个特征核对于一个图片上的多个感受野,特征核的矩阵不变。

使用梯度下降原理更新参数时,参数包括了每个卷积核,虽然一个卷积核是滑动在多个感受野得到输出矩阵的,但是特征核更新时,不会针对单独的某个感受野。

对于一个卷积神经网络,都包括哪些参数,参考文章。

池化

经过多个卷积核以后,维度更多,虽然因为保留了重要的特征信息,但是会远远的大于分类信息,在加入最后的全连接层之前,还需要浓缩一下信息,类似于结晶。

这个操作就是池化,比如常用的最大池化,方法如下:

在这里插入图片描述

示例源码

下面以一段 PyTorch 代码为例,使用卷积神经网络完成图片分类任务。

'''
CNN Model
'''
import torch
import torchvision.datasets as ds
import torchvision.transforms as ts
from torch.utils.data import DataLoader
from torch.autograd import Variable
import randomtorch.manual_seed(777)# reproducibility# parameters
batch_size=100
learning_rate=0.001
epochs=2# MNIST dataset
ds_train=ds.MNIST(root='../../../DATA/MNIST_data',train=True,transform=ts.ToTensor(),download=True)
ds_test=ds.MNIST(root='../../../DATA/MNIST_data',train=False,transform=ts.ToTensor(),download=True)
# dataset loader
dl=DataLoader(dataset=ds_train,batch_size=batch_size,shuffle=True)# CNN Model (2 conv layers)
class CNN(torch.nn.Module):def __init__(self):super(CNN,self).__init__()# L1 ImgIn shape=(?, 28, 28, 1)#    Conv     -> (?, 28, 28, 32)#    Pool     -> (?, 14, 14, 32)self.layer1=torch.nn.Sequential(torch.nn.Conv2d(1,32,kernel_size=3,stride=1,padding=1),#padding=1进行0填充torch.nn.ReLU(),torch.nn.MaxPool2d(kernel_size=2,stride=2))# L2 ImgIn shape=(?, 14, 14, 32)#    Conv      ->(?, 14, 14, 64)#    Pool      ->(?, 7, 7, 64)self.layer2=torch.nn.Sequential(torch.nn.Conv2d(32,64,kernel_size=3,stride=1,padding=1),torch.nn.ReLU(),torch.nn.MaxPool2d(kernel_size=2,stride=2))# Final FC 7x7x64 inputs -> 10 outputsself.fc=torch.nn.Linear(7*7*64,10)torch.nn.init.xavier_uniform(self.fc.weight)def forward(self,x):out=self.layer1(x)out=self.layer2(out)out=out.view(out.size(0),-1)# Flatten them for FCout=self.fc(out)return out# instantiate CNN model
model=CNN()# define cost/loss & optimizer
criterion=torch.nn.CrossEntropyLoss()# Softmax is internally computed.
optimizer=torch.optim.Adam(model.parameters(),lr=learning_rate)# train my model
print('Learning started. It takes sometime.')
for epoch in range(epochs):avg_cost=0total_batch=len(ds_train)//batch_sizefor step,(batch_xs,batch_ys) in enumerate(dl):x=Variable(batch_xs)#[100, 1, 28, 28] image is already size of (28x28), no reshapey=Variable(batch_ys)#[100] label is not one-hot encodedoptimizer.zero_grad()h=model(x)cost=criterion(h,y)cost.backward()optimizer.step()avg_cost+=cost/total_batchprint(epoch+1,avg_cost.item())
print('Learning Finished!')# Test model and check accuracy
model.eval()#!!将模型设置为评估/测试模式 set the model to evaluation mode (dropout=False)# x_test=ds_test.test_data.view(len(ds_test),1,28,28).float()
x_test=ds_test.test_data.view(-1,1,28,28).float()
y_test=ds_test.test_labelspre=model(x_test)print("pre.data=")
print(pre.data)
print("*"*3)pre=torch.max(pre.data,1)[1].float()
acc=(pre==y_test.data.float()).float().mean()
print("acc", acc)r=random.randint(0,len(x_test)-1)
x_r=x_test[r:r+1]
y_r=y_test[r:r+1]
pre_r=model(x_r)# IndexError: Dimension out of range (expected to be in range of [-1, 0], but got 1)
# https://discuss.pytorch.org/t/indexerror-dimension-out-of-range-expected-to-be-in-range-of-1-0-but-got-1/54267/12
print("pre_r.data=")
print(pre_r.data)
print("*"*3)pre_r=torch.max(pre_r.data,-1)[1].float()
print('pre_r')
print(pre_r)acc_r=(pre_r==y_r.data).float().mean()
print(acc_r)

Links

  • 卷积神经网络中感受野的详细介绍
  • 感受野详解
  • 【通信原理 入坑之路】——深入、详细地理解通信里面“卷积”概念
  • How to calculate the number of parameters in CNN?
  • 【深度学习】人人都能看得懂的卷积神经网络——入门篇

  1. 图片相关任务,包括图片分类、物体检测、实例分割、目标跟踪等。这些任务有不同的功能,但是都依赖于图片中包含的特征,这些特征都是可能平移、变幻、扭曲的。 ↩︎

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

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

相关文章

3.1 学习UVM中的uvm_component类分为几步?

文章目录 前言一、定义1.1 角色和功能:1.2 与其他UVM类的区别:1.3 主要属性和方法: 二、使用方法2.1 定义和实例化:2.2 生命周期管理:2.3 组件间通信: 三、何时使用3.1 使用场景3.2 适用组件3.3 与uvm_obje…

谷云科技RestCloud全面接入DeepSeek 开启智能新时代

在数字化转型的浪潮中,谷云科技始终走在数据集成与智能应用领域的前沿。近期,随着 DeepSeek 的火爆出圈,谷云科技紧跟技术趋势,对旗下两大核心产品 —— 数据集成软件 ETLCloud 和 AI Agent 智能体构建平台进行了重大升级&#xf…

Kafka 入门与实战

一、Kafka 基础 1.1 创建topic kafka-topics.bat --bootstrap-server localhost:9092 --topic test --create 1.2 查看消费者偏移量位置 kafka-consumer-groups.bat --bootstrap-server localhost:9092 --describe --group test 1.3 消息的生产与发送 #生产者 kafka-cons…

【个人开发】macbook m1 Lora微调qwen大模型

本项目参考网上各类教程整理而成,为个人学习记录。 项目github源码地址:Lora微调大模型 项目中微调模型为:qwen/Qwen1.5-4B-Chat。 去年新发布的Qwen/Qwen2.5-3B-Instruct同样也适用。 微调步骤 step0: 环境准备 conda create --name fin…

了解Linux 中 make 与 Makefile

目录 一、为什么开发者需要构建工具? 二、make/Makefile 1. Makefile基本规则 2.清理项目 三、make的工作原理 一、为什么开发者需要构建工具? 在软件开发中,我们经常面临这样的场景:一个项目包含数十个源代码文件&#xff…

win11右击显示全部

正常: 输入: reg.exe add "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32" /f /ve 重启或刷新进程 刷新: taskkill /f /im explorer.exe & start explorer.exe 成功:

Redis基础--常用数据结构的命令及底层编码

零.前置知识 关于时间复杂度,按照以下视角看待. redis整体key的个数 -- O(N)当前key对应的value中的元素个数 -- O(N)当前命令行中key的个数 -- O(1) 一.string 1.1string类型常用命令 1.2string类型内部编码 二.Hash 哈希 2.1hash类型常用命令 2.2hash类型内部编码 2.3ha…

React 设计模式:实用指南

React 提供了众多出色的特性以及丰富的设计模式,用于简化开发流程。开发者能够借助 React 组件设计模式,降低开发时间以及编码的工作量。此外,这些模式让 React 开发者能够构建出成果更显著、性能更优越的各类应用程序。 本文将会为您介绍五…

Unity扩展编辑器使用整理(一)

准备工作 在Unity工程中新建Editor文件夹存放编辑器脚本, Unity中其他的特殊文件夹可以参考官方文档链接,如下: Unity - 手册:保留文件夹名称参考 (unity3d.com) 一、菜单栏扩展 1.增加顶部菜单栏选项 使用MenuItem&#xff…

Vue3+codemirror6实现公式(规则)编辑器

实现截图 实现/带实现功能 插入标签 插入公式 提示补全 公式验证 公式计算 需要的依赖 "codemirror/autocomplete": "^6.18.4","codemirror/lang-javascript": "^6.2.2","codemirror/state": "^6.5.2","cod…

4.PPT:日月潭景点介绍【18】

目录 NO1、2、3、4​ NO5、6、7、8 ​ ​NO9、10、11、12 ​ 表居中或者水平/垂直居中单元格内容居中或者水平/垂直居中 NO1、2、3、4 新建一个空白演示文稿,命名为“PPT.pptx”(“.pptx”为扩展名)新建幻灯片 开始→版式“PPT_素材.doc…

开源项目介绍-词云生成

开源词云项目是一个利用开源技术生成和展示词云的工具或框架,广泛应用于文本分析、数据可视化等领域。以下是几个与开源词云相关的项目及其特点: Stylecloud Stylecloud 是一个由 Maximilianinir 创建和维护的开源项目,旨在通过扩展 wordclou…

Redis双写一致性(数据库与redis数据一致性)

一 什么是双写一致性? 当修改了数据库(MySQL)中的数据,也要同时更新缓存(redis)中的数据,缓存中的数据要和数据库中的数据保持一致 双写一致性,根据业务对时间上的要求,…

C32.【C++ Cont】静态实现双向链表及STL库的list

目录 1.知识回顾 2.静态实现演示图 3.静态实现代码 1.初始双向链表 2.头插 3.遍历链表 4.查找某个值 4.任意位置之后插入元素 5.任意位置之前插入元素 6.删除任意位置的元素 4.STL库的list 1.知识回顾 96.【C语言】数据结构之双向链表的初始化,尾插,打印和尾删 97.【C…

二级C语言题解:矩阵主、反对角线元素之和,二分法求方程根,处理字符串中 * 号

目录 一、程序填空📝 --- 矩阵主、反对角线元素之和 题目📃 分析🧐 二、程序修改🛠️ --- 二分法求方程根 题目📃 分析🧐 三、程序设计💻 --- 处理字符串中 * 号 题目&#x1f…

采用idea中的HTTP Client插件测试

1.安装插件 采用idea中的HTTP Client插件进行接口测试,好处是不用打开post/swagger等多个软件,并且可以保存测试时的参数,方便后续继续使用. 高版本(2020版本以上)的idea一般都自带这个插件,如果没有也可以单独安装. 2.使用 插件安装完成(或者如果idea自带插件),会在每个Con…

探讨如何在AS上构建webrtc(2)从sdk/android/Build.gn开始

全文七千多字,示例代码居多别担心,没有废话,不建议跳读。 零、梦开始的地方 要发美梦得先入睡,要入睡得找能躺平的地方。那么能躺平编译webrtc-android的地方在哪?在./src/sdk/android/Build.gn。Build.gn是Build.nin…

Linux firewalld开启日志审计功能(2)

在Firewalld防火墙中启用和配置logdenied选项,记录被拒绝的数据包(等同于开启日志功能) 效果展示: 1.开启日志记录功能 firewall-cmd --set-log-deniedunicast #重新加载生效配置 firewall-cmd --reload 2.配置rsyslog捕获日志…

Spring Web MVC项目的创建及使用

一、什么是Spring Web MVC? Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,从⼀开始就包含在 Spring 框架中,通常被称为Spring MVC。 1.1 MVC的定义 MVC 是 Model View Controller 的缩写,它是软件工程中的一种软件架构…

oracle:索引(B树索引,位图索引,分区索引,主键索引,唯一索引,联合索引/组合索引,函数索引)

索引通过存储列的排序值来加快对表中数据的访问速度,帮助数据库系统快速定位到所需数据,避免全表扫描 B树索引(B-Tree Index) B树索引是一种平衡树结构,适合处理范围查询和精确查找。它的设计目标是保持数据有序,并支持高效的插入…