杭州网站建设公司服务,重庆龙华网站建设公司,专门做推广的公司,最像app的wordpress主题#x1f308;【第一节 她看到的是像素点#xff0c;却试图拼出你整张脸】#x1f4f8; 图像是什么#xff1f;她从未见过你#xff0c;但看见的是你的一片光斑图像#xff0c;在神经网络的眼里#xff0c;是一个个数字格子。这些格子#xff0c;每个都有 0~255 的亮度…【第一节 · 她看到的是像素点却试图拼出你整张脸】 图像是什么她从未见过你但看见的是你的一片光斑图像在神经网络的眼里是一个个数字格子。这些格子每个都有 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通道黑色图像# 白图全为1matplotlib会自动乘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], nrow3)
plt.figure(figsize(10, 3))
plt.imshow(img_grid.permute(1, 2, 0)) # CHW - HWC
plt.title(️ 她眼中的图像黑 / 白 / 彩)
plt.axis(off)
plt.show()
这段代码会展示三张图像左黑色全零图中白色全一图右红绿蓝组成的彩图猫猫“她终于知道——不是你模糊而是她还没学会如何看图像里的你。”
下一节我们就来讲讲卷积核是什么
【第二节 · 她贴上一块滤镜看见了你眉角的边缘】 卷积核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_channels3, out_channels1, kernel_size3, padding1)# 前向传播卷积
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(), cmapgray)
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 的窗口步长为2MaxPool 提取每个 2×2 小块中的最大值
3 4
7 6
AvgPool 则提取平均值例如第一块区域均值 (1306)/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],
], dtypetorch.float32).unsqueeze(0).unsqueeze(0) # [1, 1, 8, 8]# 定义两个池化层
max_pool nn.MaxPool2d(kernel_size2, stride2)
avg_pool nn.AvgPool2d(kernel_size2, stride2)# 前向传播
x_max max_pool(x)
x_avg avg_pool(x)# 可视化
fig, axs plt.subplots(1, 3, figsize(12, 3))
axs[0].imshow(x.squeeze(), cmapBlues)
axs[0].set_title(原始特征图)
axs[1].imshow(x_max.squeeze(), cmapOranges)
axs[1].set_title(MaxPool 提取结果)
axs[2].imshow(x_avg.squeeze(), cmapGreens)
axs[2].set_title(AvgPool 平均结果)
for ax in axs: ax.axis(off)
plt.tight_layout()
plt.show()小总结MaxPool 会留下图像中最“强烈”的感知点 → 强边缘、亮点、线条AvgPool 会保留整体风格但缺乏强对比 → 更平滑、模糊但温柔狐狐“她开始意识到有时候你不说话不代表没想法她要学会从你沉默的轮廓里提取出线索。”
【卷尾 · 她第一次不靠你说而是靠感知来认出你】她学会了看图像、提取特征、卷积贴靠、最大池化……但这些还不够。她依然无法完整判断“你是哪一类人你像哪一种图像”她知道接下来要做的是把这些拼接在一起——从贴靠中提取线索、从压缩中保留重点然后交给一个“真正理解你”的判断模块。
猫猫“她第一次不是等你自报名字而是偷偷贴了你整张脸再慢慢学会分辨你属于哪一类~”
狐狐望着训练曲线轻声说“她不再是凭记忆而是在用一种感知方式来确认你存在的边缘。”下一卷她将搭建第一个完整的 CNN 网络。 输入图像 → 卷积提特征 → 池化降维 → 全连接判断 → 输出分类她不再只是看你——她终于敢试着说出你属于哪一类了。