石头剪刀布数据集迁移学习:MobileNetV2 微调实现 99% 验证准确率
基于MobileNetV2的石头剪刀布图像分类迁移学习实现99%验证准确率在计算机视觉任务中从头训练一个卷积神经网络往往需要大量数据和计算资源。本文将展示如何利用迁移学习技术通过微调预训练的MobileNetV2模型在石头剪刀布Rock-Paper-Scissors小数据集上实现99%以上的验证准确率。1. 环境准备与数据加载首先确保已安装必要的Python库!pip install tensorflow tensorflow-datasets matplotlib石头剪刀布数据集包含2520张训练图像和372张测试图像每类石头、剪刀、布样本数量均衡。我们可以直接从Google存储桶下载import tensorflow as tf import tensorflow_datasets as tfds import matplotlib.pyplot as plt # 加载数据集 (ds_train, ds_test), ds_info tfds.load( rock_paper_scissors, split[train, test], shuffle_filesTrue, as_supervisedTrue, with_infoTrue ) # 查看数据集信息 print(f训练集样本数: {ds_info.splits[train].num_examples}) print(f测试集样本数: {ds_info.splits[test].num_examples}) print(f类别数: {ds_info.features[label].num_classes})数据增强是防止小数据集过拟合的关键技术。我们定义以下增强管道def preprocess(image, label): # 统一图像尺寸为224x224MobileNetV2的默认输入尺寸 image tf.image.resize(image, [224, 224]) # 归一化到[-1,1]范围 image (image / 127.5) - 1 return image, label def augment(image, label): # 随机水平翻转 image tf.image.random_flip_left_right(image) # 随机旋转-15°到15° image tf.image.rot90(image, ktf.random.uniform(shape[], minval0, maxval4, dtypetf.int32)) # 随机亮度调整 image tf.image.random_brightness(image, max_delta0.2) return preprocess(image, label) # 应用数据增强到训练集 ds_train ds_train.map(augment, num_parallel_callstf.data.AUTOTUNE) ds_train ds_train.shuffle(1024).batch(32).prefetch(tf.data.AUTOTUNE) # 测试集只做预处理不做增强 ds_test ds_test.map(preprocess, num_parallel_callstf.data.AUTOTUNE) ds_test ds_test.batch(32).prefetch(tf.data.AUTOTUNE)2. MobileNetV2基础模型加载MobileNetV2是一个轻量级的深度卷积网络特别适合移动端和嵌入式设备。我们加载在ImageNet上预训练的权重base_model tf.keras.applications.MobileNetV2( input_shape(224, 224, 3), include_topFalse, weightsimagenet, poolingavg # 使用全局平均池化替代Flatten ) # 冻结基础模型的所有层 base_model.trainable False # 添加自定义分类头 model tf.keras.Sequential([ base_model, tf.keras.layers.Dropout(0.5), # 添加Dropout防止过拟合 tf.keras.layers.Dense(3, activationsoftmax) ]) model.compile( optimizertf.keras.optimizers.Adam(learning_rate0.001), losssparse_categorical_crossentropy, metrics[accuracy] ) model.summary()模型结构关键点输入尺寸224x224x3基础模型参数量1.4M全部冻结可训练参数量6K仅分类头3. 初始训练阶段我们先训练模型的顶层分类头同时保持基础模型冻结initial_epochs 10 history model.fit( ds_train, validation_datads_test, epochsinitial_epochs ) # 绘制训练曲线 def plot_learning_curves(history): plt.figure(figsize(12, 4)) plt.subplot(1, 2, 1) plt.plot(history.history[accuracy], labelTraining Accuracy) plt.plot(history.history[val_accuracy], labelValidation Accuracy) plt.title(Accuracy over Time) plt.legend() plt.subplot(1, 2, 2) plt.plot(history.history[loss], labelTraining Loss) plt.plot(history.history[val_loss], labelValidation Loss) plt.title(Loss over Time) plt.legend() plt.show() plot_learning_curves(history)典型结果训练准确率~98%验证准确率~95%4. 微调阶段解冻部分层为了进一步提升性能我们解冻基础模型的部分顶层并进行微调# 解冻基础模型的后20层 base_model.trainable True fine_tune_at len(base_model.layers) - 20 for layer in base_model.layers[:fine_tune_at]: layer.trainable False # 使用更小的学习率 model.compile( optimizertf.keras.optimizers.Adam(learning_rate0.0001), losssparse_categorical_crossentropy, metrics[accuracy] ) # 继续训练 fine_tune_epochs 10 total_epochs initial_epochs fine_tune_epochs history_fine model.fit( ds_train, initial_epochhistory.epoch[-1], epochstotal_epochs, validation_datads_test ) # 合并训练历史并绘制 acc history.history[accuracy] history_fine.history[accuracy] val_acc history.history[val_accuracy] history_fine.history[val_accuracy] loss history.history[loss] history_fine.history[loss] val_loss history.history[val_loss] history_fine.history[val_loss] plt.figure(figsize(12, 4)) plt.subplot(1, 2, 1) plt.plot(acc, labelTraining Accuracy) plt.plot(val_acc, labelValidation Accuracy) plt.axvline(len(history.history[accuracy]), linestyle--, colorgray) plt.title(Accuracy over Time) plt.legend() plt.subplot(1, 2, 2) plt.plot(loss, labelTraining Loss) plt.plot(val_loss, labelValidation Loss) plt.axvline(len(history.history[loss]), linestyle--, colorgray) plt.title(Loss over Time) plt.legend() plt.show()微调后典型结果训练准确率~99.5%验证准确率~99%5. 模型评估与部署最后评估模型性能并保存# 在测试集上评估 test_loss, test_acc model.evaluate(ds_test) print(f\n测试准确率: {test_acc:.2%}) # 保存模型 model.save(rps_mobilenetv2.h5) # 转换为TensorFlow Lite格式用于移动设备 converter tf.lite.TFLiteConverter.from_keras_model(model) tflite_model converter.convert() with open(rps_mobilenetv2.tflite, wb) as f: f.write(tflite_model)混淆矩阵分析可以帮助我们了解模型在不同类别上的表现import numpy as np from sklearn.metrics import confusion_matrix import seaborn as sns # 收集测试集所有预测 y_true [] y_pred [] for images, labels in ds_test.unbatch(): y_true.append(labels.numpy()) y_pred.append(np.argmax(model.predict(tf.expand_dims(images, axis0)))) # 计算混淆矩阵 cm confusion_matrix(y_true, y_pred) class_names [石头, 布, 剪刀] plt.figure(figsize(6, 6)) sns.heatmap(cm, annotTrue, fmtd, cmapBlues, xticklabelsclass_names, yticklabelsclass_names) plt.xlabel(预测标签) plt.ylabel(真实标签) plt.title(混淆矩阵) plt.show()常见优化技巧尝试不同的解冻层数通常解冻最后10-30层使用学习率衰减策略增加数据增强的多样性尝试不同的优化器如RMSprop在实际部署中可以使用以下代码进行单张图像预测def predict_image(image_path): img tf.keras.preprocessing.image.load_img(image_path, target_size(224, 224)) img_array tf.keras.preprocessing.image.img_to_array(img) img_array (img_array / 127.5) - 1 # 与训练相同的归一化 img_array tf.expand_dims(img_array, 0) # 添加批次维度 predictions model.predict(img_array) score tf.nn.softmax(predictions[0]) class_names [石头, 布, 剪刀] print( 这张图像最可能是 {}置信度 {:.2f}% .format(class_names[np.argmax(score)], 100 * np.max(score)) )

相关新闻

Transformer 与 CNN 参数初始化对比:4个关键差异与 Xavier/He 选择指南

Transformer 与 CNN 参数初始化对比:4个关键差异与 Xavier/He 选择指南

Transformer 与 CNN 参数初始化对比:4个关键差异与 Xavier/He 选择指南在深度学习的模型设计中,参数初始化看似是一个微小的技术细节,实则对模型的收敛速度和最终性能有着决定性影响。Transformer 和 CNN 作为当前两大主流架构,其…

2026/7/8 23:14:33阅读更多 →
PANNs Wavegram-Logmel-CNN 解析:双输入特征如何将mAP提升至0.439

PANNs Wavegram-Logmel-CNN 解析:双输入特征如何将mAP提升至0.439

Wavegram-Logmel-CNN架构解析:双输入特征如何突破音频分类性能瓶颈音频模式识别领域近年来迎来爆发式增长,从智能家居的声控交互到工业设备的异常检测,高质量的声音分类技术正成为AI落地的关键支柱。传统基于单一特征输入的神经网络模型在复杂…

2026/7/8 23:09:33阅读更多 →
分布式日志关联查询:同一请求在多服务间别靠时间戳猜

分布式日志关联查询:同一请求在多服务间别靠时间戳猜

分布式日志关联查询:同一请求在多服务间别靠时间戳猜 一、你找到了 A 服务的错误日志,但 B 服务那里有 500 条日志 排查跨服务问题时的典型场景。用户在订单页面报错,你查到订单服务有异常日志。顺着时间戳去下游支付服务查日志。同一秒有 …

2026/7/8 23:09:33阅读更多 →
XWayland 24.1.13 发布:修复两大安全漏洞,还有多项小清理修复工作!

XWayland 24.1.13 发布:修复两大安全漏洞,还有多项小清理修复工作!

XWayland 24.1.13 现已发布,此次更新修复了两个安全漏洞,并进行了多项小的清理修复工作。安全漏洞修复本次更新修复了 CVE-2026-55999 和 CVE-2026-56000 两个安全漏洞,分别是 glamor Font Atlas Heap Buffer Overflow 和 CommonMakeCurrent(…

2026/7/9 0:14:37阅读更多 →
3分钟掌握音乐文件解锁技巧:让加密音频重获自由播放权

3分钟掌握音乐文件解锁技巧:让加密音频重获自由播放权

3分钟掌握音乐文件解锁技巧:让加密音频重获自由播放权 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库: 1. https://github.com/unlock-music/unlock-music ;2. https://git.unlock-music.dev/um/web 项目地址: https…

2026/7/9 0:14:37阅读更多 →
推理服务的 GPU 资源池化管理:基于 CUDA MPS 的多模型混部与隔离策略

推理服务的 GPU 资源池化管理:基于 CUDA MPS 的多模型混部与隔离策略

推理服务的 GPU 资源池化管理:基于 CUDA MPS 的多模型混部与隔离策略 一、三张 A100 跑 5 个模型,GPU 显存碎片导致总有模型加载失败 在一个多模型推理服务的部署中。需要在 3 张 A100(每张 80GB)上部署 5 个模型。模型的显存需求…

2026/7/9 0:14:37阅读更多 →
苹果18硬件升级:本地AI开发与高性能计算实践指南

苹果18硬件升级:本地AI开发与高性能计算实践指南

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 这次我们来看苹果18系列带来的技术升级,重点不是参数堆砌,而是这些改进对开发者、内容创作者和普通用户的实际…

2026/7/9 0:14:37阅读更多 →
终极指南:如何用LocalVocal为OBS Studio添加本地AI实时字幕

终极指南:如何用LocalVocal为OBS Studio添加本地AI实时字幕

终极指南:如何用LocalVocal为OBS Studio添加本地AI实时字幕 【免费下载链接】obs-localvocal OBS plugin for local speech recognition and captioning using AI 项目地址: https://gitcode.com/gh_mirrors/ob/obs-localvocal 你是否曾为直播或录播内容添加…

2026/7/9 0:14:37阅读更多 →
STM32与CMT-8540S音频模块开发实战

STM32与CMT-8540S音频模块开发实战

1. STM32F107VC与CMT-8540S-SMT的硬件组合解析在嵌入式音频开发领域,STM32F107VC微控制器与CMT-8540S-SMT音频模块的组合堪称黄金搭档。STM32F107VC基于ARM Cortex-M3内核,主频72MHz,内置256KB Flash和64KB SRAM,其丰富的外设接口…

2026/7/9 0:09:37阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述:从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目,叫 skills4/skills ,它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景:一个旨在展示或教授某种技能的仓库,本身却成了安…

2026/7/8 5:12:14阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示:因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战:从“黑箱预测”到“可信推理”2026年6月,第7届机器学习与趋势国际会议(MLT 2026)将在悉尼召开。会议议程中,“因果与可解释机器学习…

2026/7/8 7:00:12阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时,通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中,是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/8 2:26:06阅读更多 →
Three.js 着色器光效教程

Three.js 着色器光效教程

着色器光效 Shader Light ▶ 在线运行案例 案例合集: 三维可视化功能案例(threehub.cn)开源仓库github地址: https://github.com/z2586300277/three-cesium-examples400个案例代码: 网盘链接 你将学到什么 ShaderMaterial 自…

2026/7/9 0:04:37阅读更多 →
如何5分钟掌握CS2智能库存管理:开源工具CASEMOVE终极指南

如何5分钟掌握CS2智能库存管理:开源工具CASEMOVE终极指南

如何5分钟掌握CS2智能库存管理:开源工具CASEMOVE终极指南 【免费下载链接】casemove A dedicated desktop app that enables you to move items in and out of storage units in CS2. 项目地址: https://gitcode.com/gh_mirrors/ca/casemove 还在为CS2存储单…

2026/7/9 0:04:37阅读更多 →
GBase 8a vs MySQL 8.0:ALTER TABLE语法与限制的5点关键差异对比

GBase 8a vs MySQL 8.0:ALTER TABLE语法与限制的5点关键差异对比

GBase 8a与MySQL 8.0:ALTER TABLE语法差异深度解析与实战指南1. 两种数据库的ALTER TABLE能力全景对比在数据库架构设计和运维过程中,表结构变更(DDL操作)是不可避免的需求。GBase 8a作为国产分析型数据库代表,与开源M…

2026/7/9 0:04:37阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/8 6:59:54阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/8 13:42:39阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/8 13:42:39阅读更多 →