1、第一部分1. LeNet 是早期成功的神经网络LeNet全称 LeNet-5是Yann LeCun在 1998 年提出的第一个实用卷积神经网络 CNN专门用于手写数字识别手写邮政编码。 在它之前图像任务只用全连接网络效果很差LeNet 第一次把「卷积 池化 全连接」的 CNN 完整架构落地证明了卷积神经网络处理图像的巨大优势是现代所有 CNNAlexNet、VGG、ResNet 等的开山鼻祖。2. 先用卷积层学习图片空间信息什么是图片空间信息图像里像素之间的位置、边缘、纹理、局部结构都属于空间信息比如数字的笔画、轮廓、横竖线条这些特征和像素的相对位置强相关。卷积层的作用局部感受野卷积核只看一小块区域专门提取局部纹理、边缘权值共享同一个卷积核整张图滑动大幅减少参数量比全连接高效得多搭配池化层下采样压缩特征图尺寸获得轻微平移鲁棒性过滤冗余信息。LeNet 的前半段就是卷积 池化交替堆叠把原始像素图片一步步转换成高度抽象的特征图把图片里的视觉模式提取出来。3. 再用全连接层转换到类别空间两个阶段分工卷积池化阶段做特征提取输出高维特征图代表图片长什么样全连接阶段做分类映射把提取好的视觉特征映射到「类别空间」。什么是类别空间以手写数字识别为例总共有 0~9 共 10 个类别类别空间就是长度为 10 的向量向量每个位置代表对应数字的预测得分。全连接层工作流程把最后一张二维特征图展平Flatten成一维长向量通过多层全连接网络做线性变换把视觉特征压缩成和类别数量相同的输出最后输出每个类别的置信度完成图像分类。完整 LeNet 流程一句话概括输入手写数字图片 → 卷积 池化提取图像空间视觉特征 → 展平特征 → 全连接层映射到数字类别空间 → 输出 0~9 的分类结果。二、补充核心设计思想现代 CNN 沿用至今分两段式架构前端卷积提取图像局部特征后端全连接负责分类先利用图像空间局部相关性卷积优势再做全局分类解决了老式全连接网络忽略像素位置关系、参数量爆炸的致命缺陷。卷积、池化、全连接层分别是什么结合 LeNet 通俗讲解1. 卷积层Convolution—— 负责提取图片视觉特征核心作用抓取图像局部空间信息边缘、线条、纹理、笔画轮廓。工作逻辑用一个小尺寸卷积核LeNet 用 5×5在整张图片上滑动每个位置做加权求和输出一张特征图。两大关键特性局部感受野只看一小块像素符合图像规律物体特征都由相邻像素构成权值共享整张图共用同一个卷积核极大减少参数量。LeNet 里的例子第一层卷积用 6 个 5×5 核自动识别手写数字的横、竖、拐角等基础笔画。2. 池化层PoolingLeNet 里叫下采样层—— 负责压缩特征、简化信息核心作用缩小特征图尺寸、减少计算量同时让特征不怕轻微移位。工作逻辑用固定窗口2×2滑动窗口内只保留最大值 / 平均值LeNet 是平均池化一张大图变小图。两个核心价值降维长宽减半后续计算量大幅降低平移鲁棒性数字轻微偏移 1 个像素池化后依然能识别到特征。LeNet 里的搭配规则固定「卷积→池化」交替卷积提取细节池化精简细节一层一层提炼更抽象的特征。3. 全连接层Fully Connected—— 负责特征转分类结果核心作用把前面卷积 池化提取好的图像特征映射到类别空间输出分类得分。工作逻辑先把最后输出的二维特征图拉平成一维长向量向量里每一个数值和下一层所有神经元全部两两相连多层线性变换后输出和类别数量相等的结果手写数字任务输出 10 个值对应 0~9。优缺点优点能全局整合所有提取到的视觉特征完成最终分类缺点参数量巨大现在很多网络会用全局平均池化替代一部分全连接层。三、实例import torchimport torch.nn as nnimport torch.optim as optimfrom torchvision import datasets, transformsimport matplotlib.pyplot as pltimport numpy as np# 导入plt之后再配置字体plt.rcParams[font.family] [SimHei, WenQuanYi Micro Hei, Heiti TC]plt.rcParams[axes.unicode_minus] False# 1. 经典LeNet-5网络卷积池化全连接class LeNet(nn.Module):def __init__(self):super().__init__()# 卷积层提取图像空间特征有可学习权重self.conv1 nn.Conv2d(in_channels1, out_channels6, kernel_size5, padding0)self.conv2 nn.Conv2d(6, 16, 5)# 池化层2×2最大池化下采样压缩尺寸无任何训练参数self.pool nn.MaxPool2d(kernel_size2, stride2)# 全连接层把提取到的视觉特征映射到0~9十个数字类别self.fc1 nn.Linear(16 * 5 * 5, 120)self.fc2 nn.Linear(120, 84)self.fc3 nn.Linear(84, 10)def forward(self, x):# CNN标准流水线卷积 → 激活函数 → 池化x self.pool(torch.sigmoid(self.conv1(x)))x self.pool(torch.sigmoid(self.conv2(x)))# 展平把二维特征图拉成一维向量才能送入全连接层x x.view(-1, 16 * 5 * 5)# 三层全连接完成分类映射x torch.sigmoid(self.fc1(x))x torch.sigmoid(self.fc2(x))out self.fc3(x)return out# 数据预处理将手写数字统一缩放为LeNet要求的32×32灰度图transform transforms.Compose([transforms.Resize((32, 32)),transforms.ToTensor()])# 自动下载MNIST手写数字数据集train_set datasets.MNIST(root./data, trainTrue, downloadTrue, transformtransform)train_loader torch.utils.data.DataLoader(train_set, batch_size8, shuffleTrue)# 初始化模型、损失函数、梯度优化器model LeNet()criterion nn.CrossEntropyLoss()optimizer optim.SGD(model.parameters(), lr0.01)# 打印网络结构直观看到卷积/池化/全连接三层模块print( LeNet 完整网络结构 )print(model)if __name__ __main__:# 取出一批手写数字图片imgs, labels next(iter(train_loader))output model(imgs)loss criterion(output, labels)# 反向传播更新网络权重optimizer.zero_grad()loss.backward()optimizer.step()# 打印每层张量维度看懂尺寸变化print(f\n输入图片维度 [批次,通道,高,宽]: {imgs.shape})print(f两层卷积池化后特征图尺寸: [8,16,5,5])print(f全连接最终输出 [批次,类别数]: {output.shape})print(f当前批次损失值: {loss.item():.4f})# 可视化对比原图 / 卷积输出 / 池化输出plt.figure(figsize(14, 4))# 原始手写数字plt.subplot(1, 3, 1)plt.title(原始输入灰度图)plt.imshow(imgs[0][0].detach().numpy(), cmapgray)# 仅卷积层输出提取边缘、笔画特征conv1_out torch.sigmoid(model.conv1(imgs[0:1]))plt.subplot(1, 3, 2)plt.title(卷积层输出提取边缘/笔画)plt.imshow(conv1_out[0][0].detach().numpy(), cmapgray)# 卷积池化后输出尺寸压缩保留关键特征pool1_out model.pool(conv1_out)plt.subplot(1, 3, 3)plt.title(池化层输出下采样压缩)plt.imshow(pool1_out[0][0].detach().numpy(), cmapgray)plt.tight_layout()plt.show()# 完整训练5轮观察损失持续下降print(\n 开始简易训练 )epochs 5for epoch in range(epochs):total_loss 0.0for batch_idx, (data, target) in enumerate(train_loader):optimizer.zero_grad()pred model(data)loss criterion(pred, target)loss.backward()optimizer.step()total_loss loss.item()print(f第{epoch1}轮 平均损失: {total_loss / len(train_loader):.4f})ResNet18import torchimport torch.nn as nnfrom torchvision import models, transformsfrom PIL import Imageimport matplotlib.pyplot as plt# 解决中文标题乱码plt.rcParams[font.family] [SimHei, Microsoft YaHei]plt.rcParams[axes.unicode_minus] False# 加载ResNet18预训练模型model models.resnet18(pretrainedTrue)model.eval()# 图片标准化预处理preprocess transforms.Compose([transforms.Resize((224, 224)),transforms.ToTensor(),transforms.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225])])# 内置1000类物体标签无需联网下载imagenet_labels [tench, goldfish, great white shark, tiger shark, hammerhead, electric ray, stingray, cock,hen, ostrich, brambling, goldfinch, house finch, junco, indigo bunting, robin, bulbul, jay,magpie, chickadee, water ouzel, kite, bald eagle, vulture, great grey owl, fire salamander,smooth newt, spotted salamander, axolotl, bullfrog, tree frog, tailed frog, loggerhead,leatherback turtle, mud turtle, terrapin, box turtle, banded gecko, common iguana,american chameleon, whiptail, agama, frilled lizard, alligator lizard, chameleon, komodo dragon,triceratops, thunder snake, ringneck snake, hognose snake, green snake, king snake, garter snake,water snake, vine snake, night snake, boa constrictor, rock python, indian cobra, green mamba,sea snake, horned viper, diamondback, sidewinder, trilobite, harvestman, scorpion,black and gold garden spider, barn spider, garden spider, black widow, tarantula, wolf spider,tick, centipede, black grouse, ptarmigan, ruffed grouse, prairie chicken, peacock, quail,partridge, african grey parrot, macaw, sulphur crested cockatoo, lorikeet, coucal, bee eater,hornbill, hummingbird, jacamar, toucan, red breasted merganser, goose, black swan,platypus, wallaby, koala, wombat, jellyfish, sea anemone, brain coral,flatworm, snail, slug, sea slug, chiton, chambered nautilus, crab,rock crab, fiddler crab, king crab, american lobster, spiny lobster, crayfish, hermit crab,white stork, black stork, spoonbill, flamingo, little blue heron, american egret,bittern, crane, limpkin, common gallinule, coot, bustard, ruddy turnstone, red backed sandpiper,pelican, king penguin, albatross, grey whale, orca,chihuahua, japanese spaniel, maltese dog, pekinese, shih tzu, blenheim spaniel,papillon, toy terrier, rhodesian ridgeback, african hunting dog, basenji, beagle, bloodhound,bluetick, black and tan coonhound, walker hound, english foxhound, redbone, borzoi, irish wolfhound,italian greyhound, whippet, ibizan hound, afghan hound, basset,sealyham terrier, airedale, australian terrier, bedlington terrier, border terrier, kerry blue terrier,irish terrier, norfolk terrier, norwich terrier, yorkshire terrier, wirehaired fox terrier, lakeland terrier,standard schnauzer, miniature schnauzer, giant schnauzer, scottish terrier, soft coated wheaten terrier,west highland white terrier, lhasa, chow, pug, leonberg,newfoundland, great pyrenees, samoyed, husky, alaskan malamute, akita, staffordshire bull terrier,american pit bull terrier, boxer, bull mastiff, french bulldog, great dane, saint bernard,eskimo dog, dalmatian, australian shepherd, bouvier des flandres,brittany spaniel, cocker spaniel, collie, border collie, golden retriever, labrador retriever,flat coated retriever, curly coated retriever, chesapeake bay retriever, german shorthaired pointer,vizsla, english setter, irish setter, english springer spaniel, welsh springer spaniel,sussex spaniel, irish water spaniel, kuvasz, schipperke, pembroke welsh corgi, cardigan welsh corgi,toy poodle, miniature poodle, standard poodle, mexican hairless dog, dingo, dhole,african wild dog, red fox, kit fox, arctic fox, grey fox, tabby cat, tiger cat, persian cat,siamese cat, egyptian cat, cougar, lynx, leopard, snow leopard, jaguar, tiger, cheetah,brown bear, american black bear, ice bear, sloth bear, mongoose, meerkat,tiger beetle, ladybug, ground beetle, long horn beetle, leaf beetle, dung beetle, butterfly, moth, bee,ant, grasshopper, cricket, stick insect, cockroach, mantis, cicada, leafhopper, lacewing,dragonfly, damselfly, mosquito, wasp, hornet, caterpillar, sea urchin,starfish, sea cucumber, wood rabbit, hare, angora rabbit, hamster, porcupine, fox squirrel,marmot, beaver, guinea pig, sorrel, zebra, pig, wild boar, warthog, hippopotamus,ox, water buffalo, bison, ram, bighorn sheep, goat, ibex, gazelle, arabian camel,llama, alpaca, walrus, deer, elk, moose, caribou, giraffe, okapi, tapir, rhino, elephant,african elephant, indian elephant, panda, red panda,gorilla, chimpanzee, orangutan, baboon, macaque, langur, colobus, proboscis monkey,marmoset, capuchin, howler monkey, titi, spider monkey, squirrel monkey, guenon, patas monkey,bush baby]# 图片识别函数def predict_image(img_path):img Image.open(img_path).convert(RGB)input_tensor preprocess(img).unsqueeze(0)with torch.no_grad():output model(input_tensor)top3_prob, top3_idx torch.topk(output, k3)softmax_score torch.softmax(top3_prob, dim1)[0]plt.figure(figsize(9, 6))plt.imshow(img)result_text 识别Top3结果\nfor i in range(3):class_name imagenet_labels[top3_idx[0][i]]score softmax_score[i].item() * 100result_text f{class_name} 置信度{score:.2f}%\nplt.title(result_text, fontsize12)plt.axis(off)plt.tight_layout()plt.show()if __name__ __main__:# 读取桌面手动保存的图片 test.jpgpic_path rC:\Users\shu\Desktop\test.jpgpredict_image(pic_path)