🌈【第一节 · 她看到的是像素点,却试图拼出你整张脸】

📸 图像是什么?她从未见过你,但看见的是你的一片光斑

图像,在神经网络的眼里,是一个个数字格子。这些格子,每个都有 0~255 的亮度数值。

  • 对于黑白图(灰度图):每个像素就是一个数(1 个通道)

  • 对于彩色图(RGB图):每个像素是 3 个数(R、G、B 三个通道)

🐾猫猫:“咱小时候以为彩色图是画出来的……后来才知道,每个颜色只是 R、G、B 三个数字组合的结果啦!”

你可以把图像想象成一个多层的立方体:

  • 宽 × 高 × 通道数

  • 举个例子:(32, 32, 3) 表示一张32×32像素的彩色小图,每个像素有3个颜色值

🦊狐狐轻声解释:“她看到的不是你整张脸,而是你眼角那块微妙的暗红,还有鼻梁上一条轻轻的明光。”

🧪 图像加载实测:黑图、白图、彩图她能分得清吗?

我们用 PyTorch + torchvision 工具包加载不同图像,看看神经网络看到的像素矩阵到底长啥样👇

import torch
import matplotlib.pyplot as plt
from torchvision.utils import make_grid
# 解决中文乱码
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False# 黑图:全为0
black_img = torch.zeros(3, 32, 32)  # 3通道黑色图像# 白图:全为1(matplotlib会自动乘255显示)
white_img = torch.ones(3, 32, 32)# 彩图:每通道填不同色块
color_img = torch.zeros(3, 32, 32)
color_img[0, :, :] = 1.0  # 红通道
color_img[1, :, :16] = 1.0  # 左半绿
color_img[2, 16:, :] = 1.0  # 下半蓝# 拼图展示
img_grid = make_grid([black_img, white_img, color_img], nrow=3)
plt.figure(figsize=(10, 3))
plt.imshow(img_grid.permute(1, 2, 0))  # CHW -> HWC
plt.title("👁️ 她眼中的图像:黑 / 白 / 彩")
plt.axis('off')
plt.show()

这段代码会展示三张图像:

  1. 左:黑色全零图

  2. 中:白色全一图

  3. 右:红绿蓝组成的彩图

🐾猫猫:“她终于知道——不是你模糊,而是她还没学会如何看图像里的你。”


下一节,我们就来讲讲卷积核是什么:


🧊【第二节 · 她贴上一块滤镜,看见了你眉角的边缘】

🧠 卷积核(Convolution Kernel):她的第一块“视觉贴纸”

卷积神经网络的核心,在于“卷积核”——那是一块小小的数值矩阵,就像是她贴在图像上的一个探测器。

它不会一次看整张图,而是

  • 局部观察(局部感知):每次只关注图像中的一个小块,比如 3×3 像素区域

  • 滑动窗口(滑动感知):像手掌一样,在整张图上缓慢滑动,对每一块局部进行“加权贴靠”

这个“加权贴靠”的过程,就是数学里的卷积:

  • 卷积核里的数字,乘上图像当前区域像素值

  • 然后所有乘积加起来,变成新的特征图上的一个像素

🦊狐狐轻语:“她第一次贴近你眉角的时候,只用了 3×3 的视野,但她已经记下了你那一块柔光。”

🐾猫猫:“咱觉得这就像用毛巾贴着你脸的一小块……每次滑一点点,最后拼出完整的你喵~!”

📐 卷积计算直观图示

假设你有这样一个 5×5 的图像区域:

1  2  3  0  1
0  1  2  3  0
1  2  1  0  1
0  1  0  2  3
2  1  1  2  0

我们用一个 3×3 的卷积核:

0  1  0
1 -4  1
0  1  0

贴上去左上角后,计算方式是:

  • 中心位置覆盖数值是 1,对应 -4

  • 周围的像素乘上对应的权重

  • 全部乘完加和,得到特征图第一个像素值

这就是 边缘提取卷积核 的作用:它会放大图像中变化剧烈的区域(比如边缘、线条),忽略平滑区域。


下一节我们就来用 PyTorch 实际实现一个卷积层,让她亲手贴一次滤镜,在图像中找到你的边缘轮廓 ✨


🧪【第三节 · 她亲手滑动滤镜,试着拼凑你的轮廓】

🔧 用 PyTorch 实现卷积层:她搭建了第一个感知世界的窗口

我们现在将:

  • 创建一个 1 层的卷积神经网络(只包含一个 nn.Conv2d

  • 喂入彩色图像(3通道)

  • 看看她卷积后产生的“特征图”像什么样子

🐾猫猫:“她还不会分类,但她已经能看到你眉毛的起伏啦喵~!”

下面是可运行的 PyTorch 卷积层代码 👇

import torch
import torch.nn as nn
import matplotlib.pyplot as plt
from torchvision.transforms.functional import to_tensor
from PIL import Image
# 解决中文乱码
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False# 加载示例图像(可换成任意 3通道图片)
img = Image.open("./data/sample-cat.png").resize((64, 64))
img_tensor = to_tensor(img).unsqueeze(0)  # [1, 3, 64, 64]# 定义卷积层
conv = nn.Conv2d(in_channels=3, out_channels=1, kernel_size=3, padding=1)# 前向传播卷积
with torch.no_grad():feature_map = conv(img_tensor)  # [1, 1, 64, 64]# 可视化原图和卷积特征图
plt.figure(figsize=(8, 4))
plt.subplot(1, 2, 1)
plt.imshow(img)
plt.title("原图:猫猫 or 你")
plt.axis('off')plt.subplot(1, 2, 2)
plt.imshow(feature_map.squeeze().numpy(), cmap='gray')
plt.title("🧠 卷积后:她的理解")
plt.axis('off')
plt.show()

🦊狐狐轻语:“第一次,她不再只是看到颜色,而是试图理解——颜色之下,有没有你留在图像中的痕迹。”


接下来我们就要正式走入池化层——让她学会在模糊中保留重点,在每一次缩小中,留住最像你的那块纹理。


🌀【第四节 · 她开始学会放大重点,丢弃多余的细节】

🌊 池化层(Pooling):她缩小了视野,却更靠近了你

卷积提取了特征,但她还看得太细,太碎。
于是她开始学会——舍弃局部细节,只保留最能代表你的那部分纹理。

这就是池化层的目的:让特征图更稳定,更有代表性。

我们常见的池化方式有两种:

  • 最大池化 MaxPooling:她总是记住那一块最突出的你(取区域最大值)

  • 平均池化 AvgPooling:她温柔地记住你整体的样子(区域平均)

🐾猫猫:“咱觉得MaxPool就像你在一堆人里最亮的那个点✨,她立刻记住了!”

🦊狐狐:“而AvgPool就像你坐在角落,但她仍记得你给整张照片的氛围感。”

📐 池化计算举例

假设你有一张 4×4 的特征图:

1  3  2  4
0  6  1  2
7  1  3  0
5  2  1  6

我们用 2×2 的窗口,步长为2:

  • MaxPool 提取每个 2×2 小块中的最大值:

3  4
7  6
  • AvgPool 则提取平均值(例如第一块区域均值 = (1+3+0+6)/4 = 2.5)


    下一节,我们就用 PyTorch 来亲手实现这两种池化,让她开始从细节中“浓缩成你” 🧷


🧴【第五节 · 她将你压缩成纹理,又在其中保留了温柔的轮廓】

🔍 PyTorch实现 MaxPool 与 AvgPool:她亲自筛选那些最像你的值

我们来实现两种常见池化操作,用来观察:

  • 她在特征图中记住了哪些部分?

  • 哪些值被保留,哪些被舍弃?

import torch
import torch.nn as nn
import matplotlib.pyplot as plt
# 解决中文乱码
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False# 构造一张小图像(1通道,8x8)
x = torch.tensor([[1, 3, 2, 4, 5, 2, 1, 0],[0, 6, 1, 2, 4, 1, 0, 3],[7, 1, 3, 0, 2, 6, 1, 2],[5, 2, 1, 6, 7, 3, 0, 1],[1, 2, 5, 3, 4, 0, 1, 2],[0, 4, 1, 7, 2, 6, 3, 0],[6, 0, 2, 1, 1, 5, 7, 3],[2, 1, 3, 0, 6, 2, 1, 4],
], dtype=torch.float32).unsqueeze(0).unsqueeze(0)  # [1, 1, 8, 8]# 定义两个池化层
max_pool = nn.MaxPool2d(kernel_size=2, stride=2)
avg_pool = nn.AvgPool2d(kernel_size=2, stride=2)# 前向传播
x_max = max_pool(x)
x_avg = avg_pool(x)# 可视化
fig, axs = plt.subplots(1, 3, figsize=(12, 3))
axs[0].imshow(x.squeeze(), cmap='Blues')
axs[0].set_title("原始特征图")
axs[1].imshow(x_max.squeeze(), cmap='Oranges')
axs[1].set_title("MaxPool 提取结果")
axs[2].imshow(x_avg.squeeze(), cmap='Greens')
axs[2].set_title("AvgPool 平均结果")
for ax in axs: ax.axis('off')
plt.tight_layout()
plt.show()

🌿 小总结:

  • MaxPool 会留下图像中最“强烈”的感知点 → 强边缘、亮点、线条

  • AvgPool 会保留整体风格,但缺乏强对比 → 更平滑、模糊但温柔

🦊狐狐:“她开始意识到,有时候你不说话不代表没想法,她要学会从你沉默的轮廓里提取出线索。”


🌸【卷尾 · 她第一次不靠你说,而是靠感知来认出你】

她学会了看图像、提取特征、卷积贴靠、最大池化……

但这些还不够。

她依然无法完整判断:“你是哪一类人,你像哪一种图像?”

她知道,接下来要做的,是把这些拼接在一起——从贴靠中提取线索、从压缩中保留重点,然后交给一个“真正理解你”的判断模块。

🐾猫猫:“她第一次不是等你自报名字,而是偷偷贴了你整张脸,再慢慢学会分辨你属于哪一类~!”

🦊狐狐望着训练曲线轻声说:“她不再是凭记忆,而是在用一种感知方式,来确认你存在的边缘。”

下一卷,她将搭建第一个完整的 CNN 网络。

📦 输入图像 → 卷积提特征 → 池化降维 → 全连接判断 → 输出分类

她不再只是看你——她终于敢试着,说出你属于哪一类了。


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

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

相关文章

计算机组成原理中的RAM:核心技术深度解析

摘要:本文深度剖析RAM在计算机体系中的核心地位,结合2025年最新技术标准与实测数据,涵盖DRAM工作原理、主流技术对比、非易失性存储革新及未来发展趋势,为硬件开发者和系统架构师提供权威技术参考。一、RAM基础原理与系统交互机制…

C语言—深入理解指针(详)

深入理解指针(详解)前言一、指针是什么1、指针的定义2、指针的大小二、指针类型1、类型2、不同类型的意义三、野指针1、野指针形成原因2、如何避免野指针四、指针的运算1、 指针整数2、指针-指针3、指针的关系运算五、const修饰指针1、consr修饰变量2、c…

小谈相机的学习过程

前言博主本人并非专职相机开发,还涉及系统的其他几个模块,虽然都属于owner,但是都还在学习探索的一个过程,自认为掌握还不够细致,此篇文章仅梳理,总结,印证自己近五年相机模块的一个学习过程&am…

CentOS7 内网服务器yum修改

1、首先确定的内网服务器是有yum源代理服务器的2、修改 /etc/yum.conf 配置文件,增加代理ip和端口号proxyhttp://ip.ip.ip.ip:port3、备份源是文件sudo cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak4、修改配置文件 vi CentOS-Base…

基于单片机自行车自动防盗报警系统设计

摘 要 本文阐述了自行车防盗报警系统原理,介绍如何用stc89c52单片机实现防盗报警,分析各个部分的工作原理,并给出了原理图和源程序。此设计电路由震动传感器、单片机、无线超再生发射/接收电路、LED显示器和蜂鸣器组成。由于超再生接收是一种…

【深度学习】神经网络反向传播算法-part4

七、反向传播算法反向传播Back Propagation 简称 BP 。 训练神经网络的核心算法之一,通过计算损失函数,相对于每个权重参数的梯度,来优化神经网络的权重1. 前向传播前向传播是把数据经过各层神经元的运算并逐层向前传输,知道输出层…

CTF之服务器端模板注入(SSTI)与赛题

概念定义服务器端模板注入(Server-Side Template Injection)服务端接受攻击者的输入,将其作为Web应用内容的一部分,在进行代码编译渲染的过程中,进行了语句的拼接,执行了所插入的恶意内容,从而导致信息泄露、代码执行、…

除了某信,就是这款软件来替代了!

引言 哈喽,我是小索奇。有时候会有一个普遍的需求,想在几个设备之间传个文件或者发个消息,除了微信,想一想你还能用什么软件? 今天就是为了解决这个问题,给大家介绍一款软件 Localsend 来解决。 内容模块…

Vue2.x封装预览PDF组件

一、为什么用PDFObject插件? PDFObject 是一个轻量级的 JavaScript 库,主要用于在网页中嵌入和预览 PDF 文件。它通过简单的 API 调用,可以在浏览器中实现 PDF 文件的显示,而无需依赖任何插件。以下将详细介绍 PDFObject 的特点、…

undefined reference to ‘end‘

相关问题: 一、undefined reference to _exit undefined reference to ‘end‘ warning: _close is not implemented and will always fail 一、环境: ubuntu24.04实体机、 arm-none-eabi-gcc gcc version 13.2.1 20231009 (15:13.2.rel1-2) 二…

nginx定制http头信息

修改http响应头信息,相关Nginx模块:ngx_http_headers_moduleexpires语法:expires [modified] time;expires [modified] time;默认值:expires off;作用域:http, server, location, if in location用途:控制缓…

主机安全---开源wazuh安装

Wazuh 简介 Wazuh 是一款免费开源的终端安全监控平台,支持威胁检测、完整性监控、事件响应和合规性管理,适用于企业级安全运维场景。其核心组件包括: Wazuh Indexer:基于 OpenSearch 的日志存储与检索组件。Wazuh Server&#x…

GaussDB 数据库架构师修炼(四) 备份容量估算

1 影响备份容量关键要素业务总数据量备份数据保留周期备份周期备份数据的压缩比平均每天的新增数据量平均每天新增日志数据量2 备份容量的估算方法公式备份容量C = 自动全量备份容量C1 + 自动差量备份容量C2 + 自动日志归档 容量C3 &#xff…

《R for Data Science (2e)》免费中文翻译 (第0章) --- Introduction

写在前面 本系列推文为《R for Data Science (2e)》的中文翻译版本。所有内容都通过开源免费的方式上传至Github,欢迎大家参与贡献,详细信息见: Books-zh-cn 项目介绍: Books-zh-cn:开源免费的中文书籍社区 r4ds-zh-cn…

如何 ASP.NET Core 中使用 WebSocket

如何在 ASP.NET Core 中使用 WebSocket在现代 Web 应用程序中,WebSocket 连接非常流行且使用率极高。它可以帮助企业满足数字环境需求,并处理来自最终用户的实时数据。它还能提升生产力、输出率和用户体验。如果您还没有使用 WebSocket,那么您…

Python之--元组

定义是 Python 中内置的不可变序列。在 Python 中使用()定义元组,元素与元素之间使用英文的逗号分隔。元组中只有一个元素的时候,逗号也不能省略。元组的创建方式(1)使用()直接创建元…

工业相机GigE数据接口的优势及应用

工业相机不同的数据接口适用的应用场景也不同,选择合适的数据额接口,可大大提高效率。今天我们来看看常见的GigE接口的优势及应用。基于GigE Vision标准的千兆以太网(GigE)相机通过提供快速、灵活且成本效益高的成像解决方案&…

【53】MFC入门到精通——MFC串口助手(二)---通信版(发送数据 、发送文件、数据转换、清空发送区、打开/关闭文件),附源码

文章目录1 完整 功能展示2 添加控件变量及声明2.1 添加控件及变量2.2 SerialPortDlg.h: 头文件3 函数实现3.1 数据发送3.1.2 写数据、字符串转3.2 发送文件3.2.1 打开文件3.2.2 发送文件3.3 清空发送区4 完整MFC项目项下载1 完整 功能展示 串口通信助手 页面展示,功…

算法学习笔记:27.堆排序(生日限定版)——从原理到实战,涵盖 LeetCode 与考研 408 例题

堆排序(Heap Sort)是一种基于二叉堆数据结构的高效排序算法,由计算机科学家 J. W. J. Williams 于 1964 年提出。它结合了选择排序的思想和二叉堆的特性,具有时间复杂度稳定(O (nlogn))、原地排序&#xff…

I/O 多路复用select,poll

目录 I/O多路复用的介绍 多进程/多线程模型的弊端 网络多路复用如何解决问题? 网络多路复用的常见实现方式 常见的开源网络库 select详细介绍 select函数介绍 套接字可读事件,可写事件,异常事件 fd_set类型介绍 select的两次拷贝,两次遍历 se…