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?
- 【深度学习】人人都能看得懂的卷积神经网络——入门篇
图片相关任务,包括图片分类、物体检测、实例分割、目标跟踪等。这些任务有不同的功能,但是都依赖于图片中包含的特征,这些特征都是可能平移、变幻、扭曲的。 ↩︎
相关文章:
CNN 卷积神经网络处理图片任务 | PyTorch 深度学习实战
前一篇文章,学习率调整策略 | PyTorch 深度学习实战 本系列文章 GitHub Repo: https://github.com/hailiang-wang/pytorch-get-started CNN 卷积神经网络 CNN什么是卷积工作原理深度学习的卷积运算提取特征不同特征核的效果比较卷积核感受野共享权重池化 示例源码 …...
LeetCode 128: 最长连续序列
LeetCode 128: 最长连续序列 题目: 给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 1: 输入:nums […...
大语言模型需要的可观测性数据的关联方式
可观测性数据的关联方式及其优缺点 随着现代分布式架构和微服务的普及,可观测性(Observability)已经成为确保系统健康、排查故障、优化性能的重要组成部分。有效的可观测性数据关联方式不仅能够帮助我们实时监控系统的运行状态,还…...
【韩顺平linux】部分上课笔记整理
整理一下一些韩顺平老师上课时候的笔记 课程:【小白入门 通俗易懂】韩顺平 一周学会Linux linux环境:使用阿里云服务器 笔记参考 : [学习笔记]2021韩顺平一周学会Linux 一、自定义函数 基本语法 应用实例: 计算两个参数的和…...
python调用pc的语音借口
先安装: pip install pyttsx3再运行: import pyttsx3 # 初始化语音引擎 def init_engine():engine pyttsx3.init()# 设置中文语音voices engine.getProperty(voices)for voice in voices:if chinese in voice.name.lower():engine.setProperty(voice…...
【Golang学习之旅】Golang 内存管理与 GC 机制详解
文章目录 前言1. Go 语言的内存管理的简述2. Golang 内存管理机制2.1 Go 语言的内存分配模型2.2 Go 变量分配示例2.3 Go 语言的内存池(sync.Pool) 3. Golang 垃圾回收(GC)机制详解3.1 Go 的 GC 机制概述3.2 GC 触发条件3.3 手动触…...
Kamailio 各个功能的共同点、不同点及应用场景
Kamailio 各个功能的共同点、不同点及应用场景: 功能共同点不同点应用场景SIP 注册服务器处理用户注册请求,维护用户位置信息专注于用户设备的注册和注销,维护设备位置企业内部通信系统,确保用户设备的动态注册和注销SIP 代理服务…...
Linux(CentOS)安装 Nginx
CentOS版本:CentOS 7 Nginx版本:1.24.0 两种安装方式: 一、通过 yum 安装,最简单,一键安装,全程无忧。 二、通过编译源码包安装,需具备配置相关操作。 最后附:设置 Nginx 服务开…...
string 与 wstring 的字符编码
测试代码: #include<stdio.h> #include<stdlib.h> #include<windows.h> #include <locale.h> #include <string> #include <iostream>// 函数用于计算UTF-8字符串中的字符数 int utf8_strlen(const char* str) {int len = 0;for (; *s…...
C#面试常考随笔14: 方法如何传递不定数量的参数?params关键字怎么使用?
使用params关键字,就可以像python传参那样传递多个参数,类似元组 主要作用 params 关键字的主要作用是让方法可以接受不定数量的参数,而不需要在调用方法时显式地创建数组来传递多个参数。这为方法调用提供了更大的灵活性,使得代…...
开发一款类似《王者荣耀》的游戏是一个复杂的系统工程,涉及多个领域的知识和技术。以下是从多个角度详细阐述如何开发的思维。
一、明确游戏定位与核心玩法 游戏类型 MOBA(Multiplayer Online Battle Arena):强调团队合作、策略性和即时战斗。确定游戏模式(如5v5、3v3等)和地图设计。 核心玩法 角色设计:英雄技能、属性、成长曲线。…...
VMware下Linux和macOS安装VSCode一些总结
本文介绍VMware下Linux和macOS安装VSCode的一些内容,包括VSCode编译器显示中文以及安装.NET环境和Python环境。 VSCode下载地址:Download Visual Studio Code - Mac, Linux, Windows 一.Linux系统下 1.安装中文包 按 Ctrl Shift P 打开命令面板。输…...
aspectFill(填充目标区域的同时保持图像的原有宽高比 (aspect ratio)图像不会被拉伸或压缩变形
“aspectFill” 是一个常用于图像和视频处理的术语,尤其是在用户界面 (UI) 设计和图形编程领域。它描述的是一种图像缩放或调整大小的方式,旨在填充目标区域的同时保持图像的原有宽高比 (aspect ratio)。 更详细的解释: Aspect Ratio (宽高比): 指的是图…...
我的年度写作计划
目录 计算机经典四件 数据结构 计算机网络体系 经典操作系统与计算机架构 嵌入式领域笔记 其他部分 私货部分 笔者打算在这里理一下今年的写作计划,如下所示: 计算机经典四件 数据结构 笔者因为冲刺面试需要,还是要更加扎实的掌握自…...
DeepSeek与llama本地部署(含WebUI)
DeepSeek从2025年1月起开始火爆,成为全球最炙手可热的大模型,各大媒体争相报道。我们可以和文心一言一样去官网进行DeepSeek的使用,那如果有读者希望将大模型部署在本地应该怎么做呢?本篇文章将会教你如何在本地傻瓜式的部署我们的…...
SOA(面向服务架构)全面解析
1. 引言 什么是SOA(面向服务架构) SOA(Service-Oriented Architecture,面向服务架构)是一种将应用程序功能以“服务”的形式进行模块化设计的架构风格。这些服务是独立的功能模块,它们通过定义明确的接口…...
PyQt6/PySide6 的 QDialog 类
QDialog 是 PyQt6 或 PySide6 库中用于创建对话框的类。对话框是一种特殊的窗口,通常用于与用户进行短期交互,如输入信息、显示消息或选择选项等。QDialog 提供了丰富的功能和灵活性,使得开发者可以轻松地创建各种类型的对话框。下面我将详细…...
mes系统对工业数字化转型起到重要作用,它的实际应用有哪些
一、生产计划与调度 在工业数字化转型中,MES 系统能够对生产计划进行高效的管理和调度。通过与企业资源计划(ERP)系统的集成,MES 可以获取生产订单信息,并根据生产设备的状态、人员安排以及物料供应情况等因素&#x…...
Qt:项目文件解析
目录 QWidget基础项目文件解析 .pro文件解析 widget.h文件解析 widget.cpp文件解析 widget.ui文件解析 main.cpp文件解析 认识对象模型 窗口坐标系 QWidget基础项目文件解析 .pro文件解析 工程新建好之后,在工程目录列表中有⼀个后缀为 ".pro" …...
【学术投稿】第五届计算机网络安全与软件工程(CNSSE 2025)
重要信息 官网:www.cnsse.org 时间:2025年2月21-23日 地点:中国-青岛 简介 第五届计算机网络安全与软件工程(CNSSE 2025)将于2025年2月21-23日在中国-青岛举行。CNSSE 2025专注于计算机网络安全、软件工程、信号处…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...
LabVIEW双光子成像系统技术
双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制,展现出显著的技术优势: 深层组织穿透能力:适用于活体组织深度成像 高分辨率观测性能:满足微观结构的精细研究需求 低光毒性特点:减少对样本的损伤…...
MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用
文章目录 一、背景知识:什么是 B-Tree 和 BTree? B-Tree(平衡多路查找树) BTree(B-Tree 的变种) 二、结构对比:一张图看懂 三、为什么 MySQL InnoDB 选择 BTree? 1. 范围查询更快 2…...
通过MicroSip配置自己的freeswitch服务器进行调试记录
之前用docker安装的freeswitch的,启动是正常的, 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...
C++_哈希表
本篇文章是对C学习的哈希表部分的学习分享 相信一定会对你有所帮助~ 那咱们废话不多说,直接开始吧! 一、基础概念 1. 哈希核心思想: 哈希函数的作用:通过此函数建立一个Key与存储位置之间的映射关系。理想目标:实现…...
Qwen系列之Qwen3解读:最强开源模型的细节拆解
文章目录 1.1分钟快览2.模型架构2.1.Dense模型2.2.MoE模型 3.预训练阶段3.1.数据3.2.训练3.3.评估 4.后训练阶段S1: 长链思维冷启动S2: 推理强化学习S3: 思考模式融合S4: 通用强化学习 5.全家桶中的小模型训练评估评估数据集评估细节评估效果弱智评估和民间Arena 分析展望 如果…...
