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

机器学习-识别手写数字

机器学习可以首先构建一个神经网络,用于识别手写数字。通过训练数据,优化神经网络的参数。再利用测试数据来测试训练完成后的神经网络的准确度。本次需要下载的库有tensorflow和matplotlib,keras和mnist数据集一般都被集成在tensorflow中了。

MNIST手写数字数据

首先查看一下MNIST手写数字的数据是什么样子的。

from tensorflow.keras.datasets import mnist# 读取MNIST数据
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()# 查看训练数据
train_images.shape()# 查看训练数据的标签
len(train_labels)
train_labels
# 训练数据
(60000, 28, 28)# 训练标签
60000
array([5, 0, 4, ..., 5, 6, 8], dtype=uint8)

从上面可以看出,MNIST手写数字的数据,是28*28的灰度图片,并且在训练数据中,有一共60000张这样的手写数字图片。在训练标签中,一共有60000个对应的数字,作为训练数据的标签。

可以利用matplot去查看这些28*28的图片是什么样子。

import matplotlib.pyplot as pltplt.imshow(train_images[0], cmap='binary')
plt.show

在这里插入图片描述

可以清晰的看到,这个手写数字图片由28*28个像素组成,并且每个像素深度在0-255之间,组成的像素表达了一个人眼可以分辨的数字5。然而机器无法直接读取出这个数字,而是通过读取每个像素的数据,根据训练好的模型才能给出结果。

构建神经网络

model = keras.Sequential([layers.Flatten(input_shape=(28, 28)),  # Flatten the input image to a vector of size 784layers.Dense(512, activation="relu"),layers.Dense(10, activation="softmax")
])model.compile(optimizer="rmsprop",loss="sparse_categorical_crossentropy",metrics=["accuracy"])

在这里可以看出,这个神经网络的结构比较简单,一共有三层。输入层,将28*28的矩阵展平为一维向量,并输入给第二层计算。第二层是一个激活函数为ReLU函数并含有512个节点的隐藏层。第三层输出层,激活函数为softmax用于多分类问题。而10个节点,也就代表了从零到九的十个数字。可以看出这个神经网络就是为了解决一个十种可能的多分类问题。

训练神经网络

在利用刚刚读取的MNIST手写数字数据集,对刚刚构建的神经网络进行训练

# 将数据缩小到0-1,有利于神经网络的快速计算和训练
train_images = train_images.astype("float32") / 255
test_images = test_images.astype("float32") / 255model.fit(train_images, train_labels, epochs=5, batch_size=128)
Epoch 1/5
469/469 ━━━━━━━━━━━━━━━━━━━━ 2s 2ms/step - accuracy: 0.8727 - loss: 0.4416
Epoch 2/5
469/469 ━━━━━━━━━━━━━━━━━━━━ 1s 2ms/step - accuracy: 0.9664 - loss: 0.1143
Epoch 3/5
469/469 ━━━━━━━━━━━━━━━━━━━━ 1s 2ms/step - accuracy: 0.9795 - loss: 0.0703
Epoch 4/5
469/469 ━━━━━━━━━━━━━━━━━━━━ 1s 2ms/step - accuracy: 0.9841 - loss: 0.0521
Epoch 5/5
469/469 ━━━━━━━━━━━━━━━━━━━━ 1s 2ms/step - accuracy: 0.9892 - loss: 0.0369

可以看出随着五次的训练,准确率升高非常迅速,损失值也在减小。

预测结果

五个批次全部训练完成后,可以根据测试数据,来对神经网络的准确性进行判断。

predictions = model.predict(test_images)# 查看第一个测试数据的图像
plt.imshow(test_images[0], cmap='binary')
plt.show()# 查看模型的预测结果
print(predictions[0])# 查看模型预测结果,最可能的值
print(predictions[0].argmax())# 查看正确的标签
print(test_labels[0])

在这里插入图片描述

313/313 ━━━━━━━━━━━━━━━━━━━━ 0s 1ms/step  
[2.4641224e-08 1.5685966e-08 4.7843769e-06 6.2090970e-05 5.8346529e-119.6760395e-08 7.8394131e-11 9.9992907e-01 3.8257639e-08 3.8722346e-06]
7
7

在这里首先输出了模型的预测结果,是从0到9的可能性。模型的最后预测结果是7最大,所以输出了7,与正确的标签一致。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 网络编程day8
  • 系统编程 网络 基于tcp协议
  • JavaScript_10_练习:轮播图
  • 深度学习--RNN以及RNN的延伸
  • 「数组」数组双指针算法合集:二路合并|逆向合并|快慢去重|对撞指针 / LeetCode 88|26|11(C++)
  • Golang | Leetcode Golang题解之第352题将数据流变为多个不相交区间
  • ROS 2中,CMakeList.txt常见语法
  • 【数据结构】二叉树的深度理解
  • 浅谈Winform
  • Qt程序比较字符串Qstring是否相等
  • day40——数据库 sqlite3
  • 这周末,除非外面下钞票,否则谁也拦不住我玩《黑神话悟空》(附:两款可以玩转悟空的显卡推荐)
  • Android 安卓Compose软键盘和Activity页面的协调处理问题
  • 【Prettier】代码格式化工具Prettier的使用和配置介绍
  • 超容易出成果的方向:多模态医学图像处理!
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • jquery cookie
  • Laravel 菜鸟晋级之路
  • mysql_config not found
  • oldjun 检测网站的经验
  • webpack项目中使用grunt监听文件变动自动打包编译
  • 手写一个CommonJS打包工具(一)
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • #define
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (2024,RWKV-5/6,RNN,矩阵值注意力状态,数据依赖线性插值,LoRA,多语言分词器)Eagle 和 Finch
  • (3) cmake编译多个cpp文件
  • (day18) leetcode 204.计数质数
  • (Git) gitignore基础使用
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (Windows环境)FFMPEG编译,包含编译x264以及x265
  • (笔试题)合法字符串
  • (苍穹外卖)day03菜品管理
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (新)网络工程师考点串讲与真题详解
  • (转)Google的Objective-C编码规范
  • .gitignore不生效的解决方案
  • .NET Core使用NPOI导出复杂,美观的Excel详解
  • .NET Core引入性能分析引导优化
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅
  • .NET 中选择合适的文件打开模式(CreateNew, Create, Open, OpenOrCreate, Truncate, Append)
  • .net/c# memcached 获取所有缓存键(keys)
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法
  • .net安装_还在用第三方安装.NET?Win10自带.NET3.5安装
  • .net开发日常笔记(持续更新)
  • @media screen 针对不同移动设备
  • @SpringBootConfiguration重复加载报错
  • [ C++ ] STL---仿函数与priority_queue
  • [1204 寻找子串位置] 解题报告
  • [bbk5179]第66集 第7章 - 数据库的维护 03
  • [C#] 基于 Token 的鉴权与签名机制详解 接口对接鉴权 token、sign(a=1b=2c=3d=4)、Base64、参数加密、MD5