当前位置: 首页 > article >正文

TensorFlow学习笔记:猫狗识别

本文为365天深度学习训练营 中的学习记录博客 原作者K同学啊一、基础设置与导入数据importmatplotlib.pyplotaspltimportnumpyasnpimportosimportPILimporttensorflowastffromtensorflowimportkerasfromtensorflow.kerasimportlayers,modelsimportpathlibfromtqdmimporttqdm# 进度条神器# 设置 GPUgpustf.config.list_physical_devices(GPU)print(Found GPUs:,gpus)# 准备数据路径data_dirpathlib.Path(./T8_data)# 加载数据img_height224img_width224batch_size32# 训练集train_dstf.keras.utils.image_dataset_from_directory(data_dir,validation_split0.2,subsettraining,seed123,image_size(img_height,img_width),batch_sizebatch_size)# 验证集val_dstf.keras.utils.image_dataset_from_directory(data_dir,validation_split0.2,subsetvalidation,seed123,image_size(img_height,img_width),batch_sizebatch_size)class_namestrain_ds.class_namesprint(f识别目标:{class_names})# 4. 数据管道加速AUTOTUNEtf.data.AUTOTUNE train_dstrain_ds.cache().shuffle(1000).prefetch(buffer_sizeAUTOTUNE)val_dsval_ds.cache().prefetch(buffer_sizeAUTOTUNE)二、搭建 CNN 模型modelmodels.Sequential([# 预处理归一化layers.Rescaling(1./255,input_shape(img_height,img_width,3)),# 卷积池化层 1layers.Conv2D(16,3,paddingsame,activationrelu),layers.MaxPooling2D(),# 卷积池化层 2layers.Conv2D(32,3,paddingsame,activationrelu),layers.MaxPooling2D(),# 卷积池化层 3layers.Conv2D(64,3,paddingsame,activationrelu),layers.MaxPooling2D(),# 防过拟合 Dropout (20% 神经元随机断开)layers.Dropout(0.2),# 全连接层layers.Flatten(),layers.Dense(128,activationrelu),layers.Dense(len(class_names))# 输出两类 (cat, dog)])model.summary()三、 编译模型model.compile(optimizeradam,losstf.keras.losses.SparseCategoricalCrossentropy(from_logitsTrue),metrics[accuracy])四、手动挡训练循环epochs20history{accuracy:[],val_accuracy:[],loss:[],val_loss:[]}forepochinrange(epochs):print(f\nEpoch{epoch1}/{epochs})# 1.训练阶段train_loss,train_acc,train_steps0,0,0# tqdm 给循环加上进度条forimages,labelsintqdm(train_ds,descTraining):loss,accmodel.train_on_batch(images,labels)train_lossloss# 把每一小批的 loss 攒起来train_accacc# 把每一小批的 acc 攒起来train_steps1# 计算整个 Epoch 的平均成绩epoch_train_losstrain_loss/train_steps epoch_train_acctrain_acc/train_steps# 2.验证阶段val_loss,val_acc,val_steps0,0,0forimages,labelsintqdm(val_ds,descValidation):loss,accmodel.test_on_batch(images,labels)# 验证集用 test_on_batchval_lossloss val_accacc val_steps1epoch_val_lossval_loss/val_steps epoch_val_accval_acc/val_steps# 把平均成绩记录到 history 字典里准备画图history[loss].append(epoch_train_loss)history[accuracy].append(epoch_train_acc)history[val_loss].append(epoch_val_loss)history[val_accuracy].append(epoch_val_acc)print(floss:{epoch_train_loss:.4f}- acc:{epoch_train_acc:.4f}- val_loss:{epoch_val_loss:.4f}- val_acc:{epoch_val_acc:.4f})修复课程中的bug在本次实验中我们放弃了傻瓜式的 model.fit()改用 model.train_on_batch() 来手动控制训练过程。但在原始逻辑下绘制出的 Training 和 Validation Accuracy/Loss 曲线出现了极其剧烈的震荡就像心电图一样忽上忽下模型似乎完全没有稳定收敛。经过代码排查发现问题出在数据记录的逻辑上。在使用 for 循环遍历一整个 Epoch 的数据时每一次 train_on_batch 都会返回当前这一小批的 loss 和 accuracy。错误的做法原因直接将循环结束时最后一次的 acc 和 loss 添加到 history 列表中作为这一个 Epoch 的最终成绩。影响这相当于用最后一批数据的成绩代表了整个训练集的成绩。如果最后一批图片刚好都很简单准确率就会飙升到 100%如果刚好都很模糊、很难认准确率就会暴跌。如何解决为了真实反映模型在一个 Epoch 内的表现我们需要计算整个 Epoch 的平均成绩。在每个 Epoch 开始前初始化三个累加器train_loss 0, train_acc 0, step 0。在遍历每一个 Batch 时将当批的成绩累加起来train_loss loss并且步骤数加一step 1。当一整个 Epoch 结束遍历完所有 Batch后除以总步骤数求平均值epoch_loss train_loss / step。最后将这个平均值追加到 history 字典中。五、 画图评估以及预测acchistory[accuracy]val_acchistory[val_accuracy]losshistory[loss]val_losshistory[val_loss]epochs_rangerange(epochs)plt.figure(figsize(12,4))plt.subplot(1,2,1)plt.plot(epochs_range,acc,labelTraining Accuracy)plt.plot(epochs_range,val_acc,labelValidation Accuracy)plt.legend(loclower right)plt.title(Training and Validation Accuracy)plt.subplot(1,2,2)plt.plot(epochs_range,loss,labelTraining Loss)plt.plot(epochs_range,val_loss,labelValidation Loss)plt.legend(locupper right)plt.title(Training and Validation Loss)plt.show()# 预测一张图片plt.figure(figsize(18,5))plt.suptitle(Prediction Results)forimages,labelsinval_ds.take(1):foriinrange(8):axplt.subplot(1,8,i1)plt.imshow(images[i].numpy().astype(uint8))# 增加一个维度模型预测需要img_arraytf.expand_dims(images[i],0)# 让模型进行预测predictionsmodel.predict(img_array)predicted_classclass_names[np.argmax(predictions)]plt.title(predicted_class)plt.axis(off)plt.show()六、总结本次课程放弃了之前使用的“自动挡” model.fit() 训练方式全面转向“手动挡”的 train_on_batch()实现对模型训练过程的底层控制。自定义训练循环 (Custom Training Loop)使用 train_on_batch() 和 test_on_batch() 逐批次Batch地将数据喂给模型。优势打破了封装的黑盒能精确掌控每一个 Epoch 和 Batch 的前向传播与反向传播过程。可视化进度追踪 (tqdm)引入了 tqdm 库在命令行中实时渲染训练和验证的进度条。优势极大地提升了代码的可读性和交互体验模型训练状态一目了然。BUG 排查与修复问题原版代码逻辑中直接将每个 Epoch 最后一次 Batch 的准确率Accuracy和损失Loss作为整个 Epoch 的成绩训练曲线出现剧烈震荡。修复方案在代码逻辑中引入了累加器。将当前 Epoch 内每一个 Batch 的 Loss 和 Accuracy 进行累加并在 Epoch 结束时除以总步数Steps求得平均值。修复效果采用平均值记录后数据客观反映了模型的全局表现彻底消除了由个别极端 Batch 引起的曲线抖动。

相关文章:

TensorFlow学习笔记:猫狗识别

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 一、基础设置与导入数据 import matplotlib.pyplot as plt import numpy as np import os import PIL import tensorflow as tf from tensorflow import ker…...

若依(ruoyi)前后端分离版—从0到1带你搭建项目(7)—表单构建、代码生成、系统接口

1.表单构建 表单构建功能是一个强大的可视化工具,用于快速生成前端表单页面。 左侧组件部分是常见的组件,包含单行文本、多行文本、下拉选择、级联选择等。 后侧的组件属性可以修改组件的一些属性信息,比如大小,等 如何把前端页…...

leetcode 1356. Sort Integers by The Number of 1 Bits 根据数字二进制下 1 的数目排序-耗时100

Problem: 1356. Sort Integers by The Number of 1 Bits 根据数字二进制下 1 的数目排序 耗时100%&#xff0c;首先拿到每个数字的二进制表达的1的个数&#xff0c;然后按照题意排序&#xff0c;排好序以后放入结果数组ret内 Code class Solution { public:vector<int> …...

PyCharm新手必看:解决‘No module named serial’报错的3种实用方法(附pyserial安装指南)

PyCharm 开发实战&#xff1a;彻底攻克“No module named serial”及其背后的Python环境管理哲学 刚接触 Python 和 PyCharm 的朋友&#xff0c;十有八九会在某个阳光明媚的下午&#xff0c;被一行冰冷的红色错误信息迎头浇上一盆冷水&#xff1a;ModuleNotFoundError: No modu…...

【linux】Samba用户添加失败排查指南:从Failed to add entry for user到完美解决

1. 当Samba对你说“不”&#xff1a;Failed to add entry for user 到底在抱怨什么&#xff1f; 嘿&#xff0c;朋友们&#xff0c;今天咱们来聊聊一个在Linux上配置Samba共享时&#xff0c;几乎人人都会踩到的经典大坑&#xff1a;Failed to add entry for user。这个错误提示…...

医疗 Java 实战:HIS 系统多协议对接全解析

1. HIS系统&#xff1a;医疗信息化的“心脏”与“交通枢纽” 在医院这个庞大而精密的体系里&#xff0c;信息流就像人体的血液&#xff0c;必须时刻保持畅通、准确。而HIS系统&#xff0c;也就是医院信息系统&#xff0c;就是驱动这整个信息循环的“心脏”。它负责着患者从踏入…...

造相 Z-Image效果展示:768×768分辨率相比512×512提升127%画质实测

造相 Z-Image效果展示&#xff1a;768768分辨率相比512512提升127%画质实测 最近在测试各种文生图模型时&#xff0c;我遇到了一个很实际的问题&#xff1a;很多模型号称能生成高清大图&#xff0c;但真跑起来&#xff0c;要么显存爆炸&#xff0c;要么生成速度慢到让人抓狂。…...

CSS毛玻璃效果实战:backdrop-filter与filter的兼容性解决方案

CSS毛玻璃效果实战&#xff1a;backdrop-filter与filter的兼容性解决方案 最近在重构一个数据仪表盘项目时&#xff0c;我遇到了一个挺有意思的挑战&#xff1a;设计师给了一个非常漂亮的玻璃拟态&#xff08;Glassmorphism&#xff09;设计稿&#xff0c;要求在侧边导航栏和悬…...

圣女司幼幽-造相Z-Turbo开源镜像深度解析:版权合规下的个人学习与研究实践

圣女司幼幽-造相Z-Turbo开源镜像深度解析&#xff1a;版权合规下的个人学习与研究实践 1. 镜像概述与核心价值 圣女司幼幽-造相Z-Turbo是一个基于Z-Image-Turbo LoRA版本的专业文生图模型&#xff0c;专门用于生成《牧神记》中圣女司幼幽角色的高质量图像。这个开源镜像为AI艺…...

13.9K Star,开源问答系统如何重塑企业知识管理

1. 从知识孤岛到智慧大脑&#xff1a;一个真实的企业困境 想象一下&#xff0c;你在一家快速发展的科技公司工作。公司有几百号人&#xff0c;产品线从软件到硬件有好几条&#xff0c;技术栈五花八门。新员工入职&#xff0c;想了解某个老项目的架构设计&#xff0c;得去翻找三…...

Veritas NetBackup 9.1 在Red Hat 7.6上的完整安装与配置指南(含避坑技巧)

Veritas NetBackup 9.1 在RHEL 7.6上的企业级部署&#xff1a;从零构建到生产级调优 对于任何一家将数据视为生命线的企业而言&#xff0c;一套可靠、高效且易于管理的备份系统&#xff0c;其重要性不亚于核心业务应用本身。Veritas NetBackup作为业界公认的企业级数据保护解决…...

拯救杂乱模型!Simulink自动连线脚本的7个实战技巧(附2023版脚本)

拯救杂乱模型&#xff01;Simulink自动连线脚本的7个实战技巧&#xff08;附2023版脚本&#xff09; 如果你在汽车电子、航空航天或者工业控制领域工作超过三年&#xff0c;并且深度使用Simulink进行模型开发&#xff0c;那么你一定经历过这样的场景&#xff1a;一个复杂的ECU&…...

新手必看!VL812 USB3.0扩展坞四层板PCB设计全流程(附嘉立创EDA工程)

从零到一&#xff1a;基于VL812的USB 3.0扩展坞四层PCB实战设计指南 你是否曾对电脑上那永远不够用的USB接口感到烦恼&#xff1f;是否想过自己动手&#xff0c;打造一个性能稳定、外观独特的USB扩展坞&#xff1f;对于硬件爱好者而言&#xff0c;从原理图到一块沉甸甸的PCB板&…...

小白也能玩转CVPR模型:MogFace人脸检测工具部署实录

小白也能玩转CVPR模型&#xff1a;MogFace人脸检测工具部署实录 1. 引言 你有没有想过&#xff0c;自己也能轻松用上那些在顶级学术会议上发表的最新AI模型&#xff1f;今天&#xff0c;我要带你体验的&#xff0c;就是一个来自CVPR 2022的“明星”模型——MogFace&#xff0…...

构建无限免费的AI编程伙伴:VSCode + Roo Code + Gemini Balance负载均衡策略详解

1. 为什么你需要一个“无限免费”的AI编程伙伴&#xff1f; 作为一名写了十几年代码的老兵&#xff0c;我太懂那种感觉了&#xff1a;面对一个棘手的技术难题&#xff0c;或者想快速搭建一个功能模块时&#xff0c;多么希望身边能有一个随时待命、知识渊博的“编程大神”可以请…...

深入解析MANGOS数据库结构表:魔兽世界私服开发者的终极指南

1. 从零开始&#xff1a;为什么你需要吃透MANGOS数据库 如果你正在折腾魔兽世界私服&#xff0c;或者打算自己动手搭建一个&#xff0c;那你肯定绕不开一个东西&#xff1a;MANGOS的数据库。这东西就像是你服务器的“大脑”&#xff0c;所有游戏世界的规则、内容、逻辑&#xf…...

CTFHUB-XSS-反射型实战:从漏洞检测到Cookie窃取

1. 初探反射型XSS&#xff1a;一个“弹窗”引发的思考 很多刚接触网络安全的朋友&#xff0c;一听到XSS&#xff08;跨站脚本攻击&#xff09;就觉得头大&#xff0c;各种类型、各种绕过&#xff0c;听起来很复杂。但说实话&#xff0c;反射型XSS可以说是其中最“直白”、也最适…...

计算机视觉(五)全连接神经网络MLP实战:从理论到代码实现

1. 从线性到非线性&#xff1a;为什么我们需要全连接神经网络&#xff1f; 如果你之前跟着我一起学过线性分类器&#xff0c;可能会觉得它挺酷的&#xff0c;给一张图片&#xff0c;算个分数&#xff0c;就能分出是猫是狗。但说实话&#xff0c;它的能力也就到这儿了。现实世界…...

ChatGPT显示Unable to Load Site错误:诊断与修复指南

作为一名开发者&#xff0c;最近在调试一个集成了对话AI功能的小项目时&#xff0c;遇到了一个让人头疼的问题&#xff1a;前端界面突然弹出了“Unable to Load Site”的提示&#xff0c;服务直接挂掉。这不仅仅是ChatGPT用户会遇到的问题&#xff0c;对于任何依赖外部API服务的…...

实时对比展示:伏羲AI模型、欧洲中心ECMWF及美国GFS全球预报效果

实时对比展示&#xff1a;伏羲AI模型、欧洲中心ECMWF及美国GFS全球预报效果 最近几年&#xff0c;AI气象预报模型异军突起&#xff0c;从实验室研究快速走向业务化应用。作为从业者&#xff0c;我一直在关注这些新模型的实际表现。今天&#xff0c;我们不谈复杂的算法原理&…...

爬虫技术进阶:深度学习环境下的反反爬策略

爬虫技术进阶&#xff1a;深度学习环境下的反反爬策略 1. 当代爬虫面临的现实困境 最近帮朋友处理一个电商数据采集需求时&#xff0c;我连续三天都没能稳定获取到商品价格信息。不是IP被封&#xff0c;就是验证码识别失败&#xff0c;更离谱的是某平台在页面里埋了十几层Jav…...

避坑指南:CentOS7.6离线升级GCC的那些‘坑’(含依赖包版本匹配与软连接修复)

从实战到精通&#xff1a;CentOS 7.6离线环境GCC升级的深度避坑与全流程解析 在离线或无外网的生产环境中&#xff0c;为CentOS 7.6升级GCC编译器&#xff0c;远不止是执行几条命令那么简单。这更像是一场对系统理解、依赖管理和故障排查能力的综合考验。许多运维工程师都曾在这…...

DeepSeek+剪映:旅游博主都在用的AI视频创作神器(附完整流程)

DeepSeek剪映&#xff1a;旅游博主都在用的AI视频创作神器&#xff08;附完整流程&#xff09; 最近和几个做旅游内容的朋友聊天&#xff0c;发现大家普遍有个痛点&#xff1a;出门一趟拍了几百个G的素材&#xff0c;回来光整理就要花掉大半天&#xff0c;更别说写文案、剪辑、…...

Windows环境下高效部署CosyVoice:从配置优化到生产环境实战

在Windows平台上部署语音服务&#xff0c;尤其是像CosyVoice这样功能丰富的项目&#xff0c;确实是个技术活。很多朋友都卡在了环境配置、性能调优这些环节&#xff0c;感觉比写业务逻辑还头疼。今天&#xff0c;我就结合自己最近在生产环境折腾CosyVoice的经历&#xff0c;跟大…...

【渗透工具】Brute Ratel C4实战:从零构建HTTP监听器到木马上线

1. 初识Brute Ratel C4&#xff1a;红队新晋“瑞士军刀” 如果你玩过Cobalt Strike或者Metasploit&#xff0c;那你对“远控”这个概念肯定不陌生。说白了&#xff0c;就是在一个可控的环境里&#xff0c;生成一个“小马”&#xff0c;扔到目标机器上跑起来&#xff0c;然后你就…...

Linux环境下Wireshark解密HTTPS流量的实战指南

1. 为什么我们需要在Linux下解密HTTPS流量&#xff1f; 大家好&#xff0c;我是老张&#xff0c;一个在运维和网络安全领域摸爬滚打了十多年的老家伙。今天想和大家聊聊一个非常实用的技能&#xff1a;在Linux环境下&#xff0c;用Wireshark这把“瑞士军刀”来解密我们本机的HT…...

OpenWrt下/etc/hosts的5个实战用法:从屏蔽广告到防DNS劫持

OpenWrt下/etc/hosts的5个实战用法&#xff1a;从屏蔽广告到防DNS劫持 如果你正在使用OpenWrt&#xff0c;那么恭喜你&#xff0c;你已经拥有了一个功能远超普通家用路由器的网络中枢。但很多时候&#xff0c;我们可能只用了它不到10%的潜力。就拿/etc/hosts这个看似不起眼的文…...

ChatGPT润色论文指令实战:从Prompt工程到学术写作优化

ChatGPT润色论文指令实战&#xff1a;从Prompt工程到学术写作优化 作为一名经常需要撰写英文论文的科研人员&#xff0c;我深知语言表达这道坎有多难跨。语法错误、句式单一、逻辑跳跃……这些问题不仅影响论文的可读性&#xff0c;更可能直接导致审稿人对研究质量的质疑。过去…...

4.1-CRUD+动态SQL【复用】+防注入:参数解析与引用机制

处理数据访问参数的基础知识点&#xff0c;直接关系到 SQL 执行的安全性和规范性 一、#{} 预编译参数绑定&#xff08;推荐使用&#xff09; #{} 是 MyBatis 参数引用的核心方式&#xff0c;其底层实现和核心特性是该知识点的重点&#xff1a;底层实现 MyBatis 在解析#{}时&…...

【OpenClaw:认知启蒙】1、OpenClaw是什么?2026年必火的本地AI智能体框架

2026年爆火开源AI智能体OpenClaw完全解读&#xff1a;从“聊天机器人”到“本地数字员工”的进化之路一句话定义&#xff1a;OpenClaw不是ChatGPT的平替&#xff0c;而是你电脑里24小时待命的“数字员工”引言&#xff1a;AI从“对话”到“执行”的产业变革 2026年&#xff0c;…...