T1周:实现mnist手写数字识别
本文为365天深度学习训练营中的学习记录博客原作者K同学啊学习目的初步使用tensorflow框架进行深度学习的整体运行一、 前期准备关于环境语言环境Python3.6编译器vsCode深度学习环境TensorFlow 2.6.21.数据导入import tensorflow as tf from tensorflow.keras import datasets, layers, models import matplotlib.pyplot as plt # 导入mnist数据依次分别为训练集图片、训练集标签、测试集图片、测试集标签 (train_images, train_labels), (test_images, test_labels) datasets.mnist.load_data()代码解析from tensorflow.keras import datasets, layers, models从tensorflow.keras中导入三个子模块datasets包含一些常用的公开数据集如 MNIST、CIFAR10 等方便我们加载。layers包含构建神经网络所需的各种层如卷积层、池化层、全连接层等。models包含构建模型的高级接口比如Sequential顺序模型。2.归一化# 将像素的值标准化至0到1的区间内。(对于灰度图片来说每个像素最大值是255每个像素最小值是0也就是直接除以255就可以完成归一化。) train_images, test_images train_images / 255.0, test_images / 255.0 # 查看数据维数信息 train_images.shape,test_images.shape,train_labels.shape,test_labels.shape代码解析train_images, test_images train_images / 255.0, test_images / 255.0图像中的像素值是 0~255 的整数。神经网络通常对输入数据的尺度敏感较大的数值会导致梯度更新不稳定、训练缓慢。这里将每个像素值除以 255.0将所有像素值缩放到[0, 1]区间。这叫做归一化Normalization能有效加速收敛并提高模型稳定性。注意这里用了浮点数除法/255.0结果变为浮点数。运行结果运行结果解读返回的数据被拆分为四个变量train_images训练集图片是一个形状为(60000, 28, 28)的 NumPy 数组代表 60000 张 28×28 像素的灰度图。train_labels训练集标签形状为(60000,)每个标签是 0~9 的数字表示图片对应的手写数字。test_images测试集图片形状为(10000, 28, 28)用于评估模型性能。test_labels测试集标签形状为(10000,)。3.查看图片# 将数据集前20个图片数据可视化显示 # 进行图像大小为20宽、10长的绘图(单位为英寸inch) plt.figure(figsize(20,10)) # 遍历MNIST数据集下标数值0~49 for i in range(20): # 将整个figure分成2行10列绘制第i1个子图。 plt.subplot(2,10,i1) # 设置不显示x轴刻度 plt.xticks([]) # 设置不显示y轴刻度 plt.yticks([]) # 设置不显示子图网格线 plt.grid(False) # 图像展示cmap为颜色图谱plt.cm.binary为matplotlib.cm中的色表 plt.imshow(train_images[i], cmapplt.cm.binary) # 设置x轴标签显示为图片对应的数字 plt.xlabel(train_labels[i]) # 显示图片 plt.show()运行结果4.图片处理#调整数据到我们需要的格式 train_images train_images.reshape((60000, 28, 28, 1)) test_images test_images.reshape((10000, 28, 28, 1)) train_images.shape,test_images.shape,train_labels.shape,test_labels.shape 输出((60000, 28, 28, 1), (10000, 28, 28, 1), (60000,), (10000,)) 运行结果原本图片形状是(高度, 宽度)即(28, 28)。但对于卷积层Conv2DKeras 要求输入形状为(高度, 宽度, 通道数)。MNIST 是灰度图通道数为 1彩色图为 3。reshape方法将每个样本从(28, 28)变为(28, 28, 1)相当于添加了最后一个维度表示通道数。训练集变为(60000, 28, 28, 1)测试集变为(10000, 28, 28, 1)。二、训练模型1. 构建CNN网络模型# 创建并设置卷积神经网络 # 卷积层通过卷积操作对输入图像进行降维和特征抽取 # 池化层是一种非线性形式的下采样。主要用于特征降维压缩数据和参数的数量减小过拟合同时提高模型的鲁棒性。 # 全连接层在经过几个卷积和池化层之后神经网络中的高级推理通过全连接层来完成。 model models.Sequential([ # 设置二维卷积层1设置32个3*3卷积核activation参数将激活函数设置为ReLu函数input_shape参数将图层的输入形状设置为(28, 28, 1) # ReLu函数作为激活励函数可以增强判定函数和整个神经网络的非线性特性而本身并不会改变卷积层 # 相比其它函数来说ReLU函数更受青睐这是因为它可以将神经网络的训练速度提升数倍而并不会对模型的泛化准确度造成显著影响。 layers.Conv2D(32, (3, 3), activationrelu, input_shape(28, 28, 1)), #池化层12*2采样 layers.MaxPooling2D((2, 2)), # 设置二维卷积层2设置64个3*3卷积核activation参数将激活函数设置为ReLu函数 layers.Conv2D(64, (3, 3), activationrelu), #池化层22*2采样 layers.MaxPooling2D((2, 2)), layers.Flatten(), #Flatten层连接卷积层与全连接层 layers.Dense(64, activationrelu), #全连接层特征进一步提取64为输出空间的维数activation参数将激活函数设置为ReLu函数 layers.Dense(10) #输出层输出预期结果10为输出空间的维数 ]) # 打印网络结构 model.summary()代码解析layers.Conv2D(32, (3, 3), activationrelu, input_shape(28, 28, 1))二维卷积层是 CNN 的核心。32该层有 32 个卷积核滤波器每个卷积核会提取一种特征因此输出特征图feature map的深度为 32。(3, 3)卷积核的大小为 3×3 像素。activationrelu激活函数使用 ReLURectified Linear Unit公式为max(0, x)。它能引入非线性并且计算简单有助于缓解梯度消失问题。input_shape(28, 28, 1)指定输入数据的形状只有第一层需要设置后续层会自动推断。该层输出形状为(None, 26, 26, 32)因为 3×3 卷积不填充时高度和宽度各减 2。layers.MaxPooling2D((2, 2))最大池化层池化窗口大小为 2×2步长默认为 2。作用在 2×2 区域内取最大值将特征图尺寸减半高度和宽度各减半减少参数数量同时保留主要特征并提高模型的平移不变性。输出形状为(None, 13, 13, 32)。layers.Conv2D(64, (3, 3), activationrelu)第二个卷积层64 个 3×3 卷积核激活函数 ReLU。输出形状为(None, 11, 11, 64)因为 13-3111。layers.MaxPooling2D((2, 2))再次最大池化输出形状为(None, 5, 5, 64)。layers.Flatten()展平层。将多维特征图5×5×64展平成一维向量长度为 5×5×641600以便输入到全连接层。layers.Dense(64, activationrelu)全连接层稠密层有 64 个神经元激活函数 ReLU。这层对提取的高层特征进行非线性组合进一步提取特征。layers.Dense(10)输出层10 个神经元对应 10 个类别数字 0~9。这里没有指定激活函数因为后续损失函数SparseCategoricalCrossentropy会设置from_logitsTrue表示直接输出未经过 softmax 的 logits原始分数内部会自动计算 softmax 并计算交叉熵。运行结果2.编辑模型 这里设置优化器、损失函数以及metrics # model.compile()方法用于在配置训练方法时告知训练时用的优化器、损失函数和准确率评测标准 model.compile( # 设置优化器为Adam优化器 optimizeradam, # 设置损失函数为交叉熵损失函数tf.keras.losses.SparseCategoricalCrossentropy() # from_logits为True时会将y_pred转化为概率用softmax否则不进行转换通常情况下用True结果更稳定 losstf.keras.losses.SparseCategoricalCrossentropy(from_logitsTrue), # 设置性能指标列表将在模型训练时监控列表中的指标 metrics[accuracy])3.训练模型 这里设置输入训练数据集图片及标签、验证数据集图片及标签以及迭代次数epochs 关于model.fit()函数的具体介绍可参考我的博客 https://blog.csdn.net/qq_38251616/article/details/122321757 history model.fit( # 输入训练集图片 train_images, # 输入训练集标签 train_labels, # 设置10个epoch每一个epoch都将会把所有的数据输入模型完成一次训练。 epochs10, # 设置验证集 validation_data(test_images, test_labels))运行结果三、模型预测plt.imshow(test_images[1])运行结果:pre model.predict(test_images) # 对所有测试图片进行预测 pre[1] # 输出第一张图片的预测结果运行结果四、总结之前已经学习了pytorch框架的深度学习基础本次开始学习tensorflow框架。二者在代码运行上还是有不一样的框架TensorFlowPyTorch数据格式加载后直接是 NumPy 数组(60000, 28, 28)。加载后是Dataset对象需要配合DataLoader才能批量取出。通道顺序HWC高、宽、通道。灰度图是(28, 28, 1)。CHW通道、高、宽。灰度图是(1, 28, 28)。你看到的imgs.shape输出为[32, 1, 28, 28]归一化手动除以255.0。使用transforms.ToTensor()它不仅把图片转为张量自动除以 255归一化到 [0,1]还自动把 HWC 转为 CHW。批量读取没有专门的加载器直接用切片。使用DataLoadertrain_dl它能自动打乱shuffleTrue数据、按批次batch_size32打包还支持多线程读取。在模型构建上TF用models.Sequential([层1, 层2, ...])按顺序“组装”层层与层之间自动传递数据。PyTorch必须新建一个类继承nn.Module。在__init__里定义好“零件”比如self.conv1self.fc1。在forward(self, x)函数里手动写清楚数据流向x self.pool1(F.relu(self.conv1(x)))。在训练过程也有明显的不同TF (T1)一行代码搞定。history model.fit(train_images, train_labels, epochs10, validation_data(test_images, test_labels))PyTorch (P1)需要双层循环for epoch套for X, y in dataloader清空梯度optimizer.zero_grad()。前向传播pred model(X)。计算损失loss loss_fn(pred, y)。反向传播loss.backward()计算每个参数的梯度。更新参数optimizer.step()用计算好的梯度去更新权重。手动计算准确率(pred.argmax(1) y).sum()。

相关新闻

Containerlab实战系列之五:Containerlab 网络抓包

Containerlab实战系列之五:Containerlab 网络抓包

📋 本文目录 方法一:宿主机上执行命令抓包方法二:即时显示在本地 Wireshark 中方法三:进入容器中抓包 方法一:宿主机上执行命令抓包 启动后台抓包 [rootjmz mylab]# ip netns exec clab-simple-crpd-ping-r1 tcpdu…

2026/10/10 21:23:22 阅读更多 →
Java类的继承基础笔记:继承与重写

Java类的继承基础笔记:继承与重写

前言 本文面向编程零基础小白,用生活化案例通俗讲解 Java 中类的继承与重写核心概念、组成要素与完整实操流程,手把手演示继承、重写完整可运行代码示例。 一、核心概念 1.继承 继承是面向对象编程的三大特性之一: 它是Java编程语言的基…

2026/10/10 10:54:05 阅读更多 →
个人笔记4 从学生管理系统理解分层架构与泛型

个人笔记4 从学生管理系统理解分层架构与泛型

今天的任务是一个非常标准的,分层式架构,面向接口对的代码。很绕很抽象,但好处同样很多。在讲之前,我自己先寻思着写了一份,是意大利面条型的,就分了三大类,乱七八糟,写到后面我自己…

2026/10/10 22:20:19 阅读更多 →

最新新闻

VirtualBox与内核隔离冲突?VT-x不可用原因与解决方案全解析

VirtualBox与内核隔离冲突?VT-x不可用原因与解决方案全解析

1. 冲突现象:VirtualBox 在启用内核隔离的机器上一夜之间全军覆没 先说一个很多 Windows 用户都撞见过的场景:某天打开 VirtualBox,双击一个之前跑得好好的虚拟机,结果弹窗提示“This kernel requires an X86-64 CPU, but only de…

2026/10/11 18:03:39 阅读更多 →
GMM图像颜色分割实战:MATLAB实现与参数调优指南

GMM图像颜色分割实战:MATLAB实现与参数调优指南

简介:面向图像处理学习者与相关开发者的高斯混合模型颜色分割实现,提供完整可运行的训练与预测代码,解决按颜色自动分离图像区域的常见需求。项目利用高斯混合模型对像素颜色分布进行概率建模,通过期望最大化算法迭代估计模型参数…

2026/10/11 18:03:39 阅读更多 →
PowerBI与FineBI对比:构建可复现的BI选型评估框架

PowerBI与FineBI对比:构建可复现的BI选型评估框架

简介:《PowerBI VS FineBI 对比分析文档》围绕两类主流商业智能平台在数据连接、引擎架构、数据处理、前端展现、多维分析、填报能力、集成应用及数据管控等方面的差异展开,适合正在做BI工具选型的企业信息化负责人、数据分析师、产品经理,也…

2026/10/11 18:03:39 阅读更多 →
Hotdata CLI 向量搜索实战:服务端自动embedding,不写一行代码实现语义检索

Hotdata CLI 向量搜索实战:服务端自动embedding,不写一行代码实现语义检索

【免费下载链接】hotdata-cli CLI for Hotdata 项目地址: https://gitcode.com/gh_mirrors/ho/hotdata-cli 点击查看 免费下载 Hotdata CLI 是 Hotdata 平台的命令行工具,支持向量搜索、BM25 全文检索与 SQL 查询。它做语义检索最大的特点是服务端自动 …

2026/10/11 18:03:39 阅读更多 →
HTTP与HTTPS协议精讲:抓包实验、明文传输与证书部署

HTTP与HTTPS协议精讲:抓包实验、明文传输与证书部署

翻出我第一阶段的学习笔记,最让我印象深刻的不是某个漏洞案例,而是一次最简单的抓包实验。当时我在本机搭了个测试用的登录页,本想着“还没学到安全攻防,先看看协议长什么样”。结果抓包工具里清清楚楚地显示,我输入的…

2026/10/11 18:03:39 阅读更多 →
C# WinForms 部署 YOLOv11 ONNX:从模型导出到目标检测实战

C# WinForms 部署 YOLOv11 ONNX:从模型导出到目标检测实战

简介:一份面向C# WinForm开发者的YOLOv11目标检测部署演示资料包,配套ONNX模型与运行说明。资源基于VS2019和.NET Framework 4.7.2环境,集成OpenCvSharp4.8.0与ONNX Runtime 1.16.2,完整展示了从模型加载、图像预处理到推理结果展…

2026/10/11 18:02:39 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →