深度学习P6周:VGG-16算法-Pytorch实现人脸识别
本文为365天深度学习训练营中的学习记录博客原作者K同学啊学习目的1.在理解CNN的基础上认识VGG-16架构。2.调用官方的VGG-16架构。注VGG-16由16个卷积层和3个全连接层组成因此具有较深的网络结构。有助于网络学习到更加抽象和复杂的特征。卷积层的设计VGG-16的卷积层全部采用3×3的卷积核和步长为1的卷积操作同时在卷积层之后都接有Relu激活函数。这种设计的好处在于通过堆叠多个较小的卷积核可以提高网络的非线性建模能力同时减少了参数数量从而降低了过拟合的风险。池化层在卷积层之后VGG-16使用最大池化层来减少特征图的空间尺寸帮助提取更加显著的特征并减少计算量。全连接层VGG-16在卷积层之后接有3个全连接层最后一个全连接层输出与类别数相对应的向量用于进行分类。VGG-16包含了16个隐藏层13个卷积层和3个全连接层故称为 VGG-16。网络架构图前期准备导入相关库并确定使用GPUimport torch import torch.nn as nn import torchvision.transforms as transforms import torchvision from torchvision import transforms, datasets import os,PIL,pathlib,warnings warnings.filterwarnings(ignore) #忽略警告信息 device torch.device(cuda if torch.cuda.is_available() else cpu) device导入数据查看子文件import os,PIL,random,pathlib data_dir ./6-data/ data_dir pathlib.Path(data_dir) data_paths list(data_dir.glob(*)) classeNames [str(path).split(\\)[1] for path in data_paths] classeNames对图像进行标准化RGB彩图常规操作# 关于transforms.Compose的更多介绍可以参考https://blog.csdn.net/qq_38251616/article/details/124878863 train_transforms transforms.Compose([ transforms.Resize([224, 224]), # 将输入图片resize成统一尺寸 # transforms.RandomHorizontalFlip(), # 随机水平翻转 transforms.ToTensor(), # 将PIL Image或numpy.ndarray转换为tensor并归一化到[0,1]之间 transforms.Normalize( # 标准化处理--转换为标准正太分布高斯分布使模型更容易收敛 mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]) # 其中 mean[0.485,0.456,0.406]与std[0.229,0.224,0.225] 从数据集中随机抽样计算得到的。 ]) total_data datasets.ImageFolder(./6-data/,transformtrain_transforms) total_data划分数据集并加载数据查看数据sizetrain_size int(0.8 * len(total_data)) test_size len(total_data) - train_size train_dataset, test_dataset torch.utils.data.random_split(total_data, [train_size, test_size]) train_dataset, test_datasetbatch_size 32 train_dl torch.utils.data.DataLoader(train_dataset, batch_sizebatch_size, shuffleTrue, num_workers1) test_dl torch.utils.data.DataLoader(test_dataset, batch_sizebatch_size, shuffleTrue, num_workers1) for X, y in test_dl: print(Shape of X [N, C, H, W]: , X.shape) print(Shape of y: , y.shape, y.dtype) break下载调用官方VGG-16模型from torchvision.models import vgg16 device cuda if torch.cuda.is_available() else cpu print(Using {} device.format(device)) # 加载预训练模型并且对模型进行微调 model vgg16(pretrained True).to(device) # 加载预训练的vgg16模型 for param in model.parameters(): param.requires_grad False # 冻结模型的参数这样子在训练的时候只训练最后一层的参数 # 修改classifier模块的第6层即(6): Linear(in_features4096, out_features2, biasTrue) # 注意查看我们下方打印出来的模型 model.classifier._modules[6] nn.Linear(4096,len(classeNames)) # 修改vgg16模型中最后一层全连接层输出目标类别个数 model.to(device) model编写训练函数# 训练循环 def train(dataloader, model, loss_fn, optimizer): size len(dataloader.dataset) # 训练集的大小 num_batches len(dataloader) # 批次数目, (size/batch_size向上取整) train_loss, train_acc 0, 0 # 初始化训练损失和正确率 for X, y in dataloader: # 获取图片及其标签 X, y X.to(device), y.to(device) # 计算预测误差 pred model(X) # 网络输出 loss loss_fn(pred, y) # 计算网络输出和真实值之间的差距targets为真实值计算二者差值即为损失 # 反向传播 optimizer.zero_grad() # grad属性归零 loss.backward() # 反向传播 optimizer.step() # 每一步自动更新 # 记录acc与loss train_acc (pred.argmax(1) y).type(torch.float).sum().item() train_loss loss.item() train_acc / size train_loss / num_batches return train_acc, train_loss编写测试函数def test (dataloader, model, loss_fn): size len(dataloader.dataset) # 测试集的大小 num_batches len(dataloader) # 批次数目, (size/batch_size向上取整) test_loss, test_acc 0, 0 # 当不进行训练时停止梯度更新节省计算内存消耗 with torch.no_grad(): for imgs, target in dataloader: imgs, target imgs.to(device), target.to(device) # 计算loss target_pred model(imgs) loss loss_fn(target_pred, target) test_loss loss.item() test_acc (target_pred.argmax(1) target).type(torch.float).sum().item() test_acc / size test_loss / num_batches return test_acc, test_loss设置动态学习率调用官方的方法learn_rate 1e-4 # 初始学习率 # optimizer torch.optim.SGD(model.parameters(), lrlearn_rate) lambda1 lambda epoch: 0.92 ** (epoch // 4) optimizer torch.optim.SGD(model.parameters(), lrlearn_rate) scheduler torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambdalambda1) #选定调整方法正式训练import copy loss_fn nn.CrossEntropyLoss() # 创建损失函数 epochs 40 train_loss [] train_acc [] test_loss [] test_acc [] best_acc 0 # 设置一个最佳准确率作为最佳模型的判别指标 for epoch in range(epochs): # 更新学习率使用自定义学习率时使用 # adjust_learning_rate(optimizer, epoch, learn_rate) model.train() epoch_train_acc, epoch_train_loss train(train_dl, model, loss_fn, optimizer) scheduler.step() # 更新学习率调用官方动态学习率接口时使用 model.eval() epoch_test_acc, epoch_test_loss test(test_dl, model, loss_fn) # 保存最佳模型到 best_model if epoch_test_acc best_acc: best_acc epoch_test_acc best_model copy.deepcopy(model) train_acc.append(epoch_train_acc) train_loss.append(epoch_train_loss) test_acc.append(epoch_test_acc) test_loss.append(epoch_test_loss) # 获取当前的学习率 lr optimizer.state_dict()[param_groups][0][lr] template (Epoch:{:2d}, Train_acc:{:.1f}%, Train_loss:{:.3f}, Test_acc:{:.1f}%, Test_loss:{:.3f}, Lr:{:.2E}) print(template.format(epoch1, epoch_train_acc*100, epoch_train_loss, epoch_test_acc*100, epoch_test_loss, lr)) # 保存最佳模型到文件中 PATH ./best_model.pth # 保存的参数文件名 torch.save(best_model.state_dict(), PATH) print(Done)模型训练结果可视化import matplotlib.pyplot as plt #隐藏警告 import warnings warnings.filterwarnings(ignore) #忽略警告信息 plt.rcParams[font.sans-serif] [SimHei] # 用来正常显示中文标签 plt.rcParams[axes.unicode_minus] False # 用来正常显示负号 plt.rcParams[figure.dpi] 100 #分辨率 from datetime import datetime current_time datetime.now() # 获取当前时间 epochs_range range(epochs) plt.figure(figsize(12, 3)) plt.subplot(1, 2, 1) plt.plot(epochs_range, train_acc, labelTraining Accuracy) plt.plot(epochs_range, test_acc, labelTest Accuracy) plt.legend(loclower right) plt.title(Training and Validation Accuracy) plt.xlabel(current_time) # 打卡请带上时间戳否则代码截图无效 plt.subplot(1, 2, 2) plt.plot(epochs_range, train_loss, labelTraining Loss) plt.plot(epochs_range, test_loss, labelTest Loss) plt.legend(locupper right) plt.title(Training and Validation Loss) plt.show()调用模型对于指定图片进行预测预测函数构建from PIL import Image classes list(total_data.class_to_idx) def predict_one_image(image_path, model, transform, classes): test_img Image.open(image_path).convert(RGB) plt.imshow(test_img) # 展示预测的图片 test_img transform(test_img) img test_img.to(device).unsqueeze(0) model.eval() output model(img) _,pred torch.max(output,1) pred_class classes[pred] print(f预测结果是{pred_class})预测训练集中的某张图片# 预测训练集中的某张照片 predict_one_image(image_path./6-data/Angelina Jolie/001_fe3347c0.jpg, modelmodel, transformtrain_transforms, classesclasses)查看最优模型的准确率best_model.eval() epoch_test_acc, epoch_test_loss test(test_dl, best_model, loss_fn) epoch_test_acc, epoch_test_loss心得体会1.本次任务人脸识别难度较大且类别较多导致准确率较低不过模型的训练依然收敛私以为VGG-16更适用自然物体等简单图像。2.复杂背景对于模型进行人脸识别干扰较大应当适当裁剪3.尝试了更换优化器和数据增强的方法准确率提升较少只有小幅提升4%~5%因此认为应从网络架构本身出发在后续的学习中会更加注意对于人脸识别这一类细粒度识别的任务用哪一类网络会比较好。

相关新闻

2026年十大低代码平台横向测评:谁是企业级开发的终极王者?

2026年十大低代码平台横向测评:谁是企业级开发的终极王者?

引言 在数字化转型浪潮下,低代码开发平台凭借其“快速构建、降低门槛”的核心优势,已成为企业和开发者提升效率的重要工具。相较于国外平台,国内低代码平台更贴合本土业务场景、数据合规要求及使用习惯。本文将系统梳理国内主流的低代码平台&…

2026/7/23 8:11:07 阅读更多 →
电力负荷预测基准测试:时间序列Transformer模型表现超越传统方法

电力负荷预测基准测试:时间序列Transformer模型表现超越传统方法

这次我们来看一个电力负荷预测领域的基准测试项目,重点不是介绍某个具体的预测模型,而是评估不同方法在跨电网层级负荷预测任务中的表现。该项目由研究团队开源,旨在为电力系统负荷预测提供一个标准化的评估框架。 最值得关注的是&#xff0…

2026/7/23 8:11:07 阅读更多 →
揭秘D2数字磁带录像机的无压缩技术与专业应用

揭秘D2数字磁带录像机的无压缩技术与专业应用

1. 项目概述:揭秘D2数字磁带录像机的极限性能 第一次见到索尼DVR-20工作时,我被监视器上跳出的142Mbps码率数值震惊了——这相当于现在主流4K视频的3倍数据量,而它记录的仅仅是标清画面。这台诞生于1996年的专业设备,代表着模拟向…

2026/7/23 8:11:07 阅读更多 →

最新新闻

【AI自动化落地避坑指南】:20年专家亲历的7大认知陷阱与实战纠偏手册

【AI自动化落地避坑指南】:20年专家亲历的7大认知陷阱与实战纠偏手册

更多请点击: https://kaifayun.com 第一章:AI自动化落地的认知前提与本质误区 在企业推进AI自动化的过程中,最隐蔽却最具破坏力的障碍并非技术瓶颈,而是根植于组织认知底层的系统性误区。许多团队将“部署大模型API”等同于“实现…

2026/7/23 15:32:19 阅读更多 →
GeometryZero:基于GCPO的LLM几何解题强化学习框架

GeometryZero:基于GCPO的LLM几何解题强化学习框架

1. GeometryZero项目概述GeometryZero是一套针对大型语言模型(LLM)几何解题能力优化的强化学习框架,其核心创新在于提出了Group Contrastive Policy Optimization(GCPO)方法。这个方案解决了当前LLM在几何推理任务中存在的两个关键痛点&#…

2026/7/23 15:32:19 阅读更多 →
Agentic AI与提示工程在智能客服中的实践与优化

Agentic AI与提示工程在智能客服中的实践与优化

1. 智能客服的现状与Agentic AI的机遇当前智能客服系统普遍面临三个核心痛点:机械化的应答模式、上下文断裂的对话体验、以及缺乏主动服务意识。传统基于规则和简单机器学习的客服方案,往往只能处理预设场景下的标准问题。当用户提出超出知识库范围的请求…

2026/7/23 15:32:19 阅读更多 →
ARM Cortex-M EPI中断与主机总线配置实战:从寄存器到代码

ARM Cortex-M EPI中断与主机总线配置实战:从寄存器到代码

1. 项目概述与核心价值 在嵌入式系统开发,尤其是基于ARM Cortex-M内核的微控制器项目中,外部总线接口的配置与中断管理往往是决定系统性能与稳定性的关键。很多工程师在初次接触像Tiva™ C系列这类功能丰富的MCU时,面对动辄几十个、每个都有数…

2026/7/23 15:32:19 阅读更多 →
多语言配音项目失败率高达68%?独家披露某Top3流媒体平台重构AI配音管线的12步故障树分析法(含语音情感一致性校验工具)

多语言配音项目失败率高达68%?独家披露某Top3流媒体平台重构AI配音管线的12步故障树分析法(含语音情感一致性校验工具)

更多请点击: https://codechina.net 第一章:多语言配音项目失败率的行业真相与认知重构 行业数据显示,全球多语言配音项目平均失败率高达43%,远超本地化整体失败率(22%)。这一数字并非源于技术不可达&…

2026/7/23 15:32:19 阅读更多 →
基于大数据的电商商品推荐系统

基于大数据的电商商品推荐系统

基于大数据的电商商品推荐系统 摘要 随着电子商务规模持续扩大,用户面临“信息过载”与“选择疲劳”问题日益突出,个性化推荐已成为提升用户体验、增强平台转化率与用户粘性的核心技术手段。本研究聚焦于构建一个融合协同过滤、内容特征建模与实时行为分…

2026/7/23 15:31:18 阅读更多 →

日新闻

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

更多请点击: https://intelliparadigm.com 第一章:从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表) 当AI副业主理人不再仅满足于单次服务交付,而是主动构建可复用、可裂变、可…

2026/7/23 0:00:25 阅读更多 →
AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

更多请点击: https://codechina.net 第一章:AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析 在对2,346篇跨行业AI生成文案的A/B测试数据进行聚类分析后,我们发现&#xff1…

2026/7/23 0:01:26 阅读更多 →
Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具 【免费下载链接】chitchatter Secure peer-to-peer chat that is serverless, decentralized, and ephemeral 项目地址: https://gitcode.com/gh_mirrors/ch/chitchatter Chitchatter是一款革命性的安…

2026/7/23 0:01:26 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/22 8:58:19 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/22 19:43:43 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/22 12:54:44 阅读更多 →

月新闻