MNIST机器学习入门

news2024/9/22 13:44:07

在这里插入图片描述

引入所需库

import os

import cv2
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import tensorflow as tf
from PIL import Image

MNIST数据集

下载MNIST数据集

mnist=tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()

x_train、y_train、x_test 和 y_test 是用于机器学习的数据集,具体说明如下:

  1. x_train:训练数据集的特征集,即包含多个训练样本的输入数据。对于 MNIST 数据集来说,x_train 是一个四维数组,形状为 (num_samples, height, width, num_channels),表示训练样本的图像数据。
  1. y_train:训练数据集的标签集,即包含多个训练样本的输出标签或类别信息。对于 MNIST 数据集来说,y_train 是一个一维数组,形状为 (num_samples,),其中每个元素代表相应训练样本的数字标签(0-9)。
  1. x_test:测试数据集的特征集,即包含多个测试样本的输入数据。与 x_train 类似,x_test 也是一个四维数组,形状为 (num_samples, height, width, num_channels),表示测试样本的图像数据。
  1. y_test:测试数据集的标签集,即包含多个测试样本的输出标签或类别信息。与 y_train 类似,y_test 是一个一维数组,形状为 (num_samples,),其中每个元素代表相应测试样本的数字标签。

这些数据集是经过预处理和分割的手写数字数据集(MNIST),通常用于机器学习中的图像分类任务。通过将模型训练在 x_train 和 y_train 上,然后在 x_test 上进行测试并与 y_test 进行比较,可以评估模型的性能和准确度。

查看各个变量的形状大小

print("训练数据集的特征集",x_train.imag.shape)
print("训练数据集的标签集",y_train.imag.shape)
print("测试数据集的特征集",x_test.imag.shape)
print("测试数据集的标签集",y_test.imag.shape)
训练数据集的特征集 (60000, 28, 28)
训练数据集的标签集 (60000,)
测试数据集的特征集 (10000, 28, 28)
测试数据集的标签集 (10000,)

将MNIST数据保存为图片

#设置保存路径
save_dir="./data/images/mnist"
#判断路径是否存在
if os.path.exists(save_dir) is False:
    os.makedirs(save_dir)
#设置画布大小
plt.figure(figsize=(20, 18))
#获取前二十张图片索引
indices = list(range(1, 21))
#绘制前二十张图片并且保存为图片文件
for i in indices:
    img = x_train[i].reshape((28, 28))
    #设置为四行五列
    plt.subplot(4, 5, i)
    plt.imshow(img, cmap='gray')
    #保存图片到本地
    plt.savefig(save_dir+'/image_{}.png'.format(i))
    #设置横轴标签
    plt.xlabel('image_{}.png'.format(i))
    plt.xticks([])
    plt.yticks([])
plt.show()

png

图象标签的独热表示

独热编码(One-Hot Encoding)是一种将分类变量转换为二进制向量的方法,其中每个类别都被表示为一个独立的二进制向量。在图象标签的独热表示中,每个标签都被视为一个独立的二进制向量,其中只有一个元素为1,其余元素为0。
例如,假设我们有三个类别:猫、狗和鸟。如果我们要对这些类别进行独热编码,那么每个类别都将被表示为一个长度为3的向量,其中第一个元素为1,其余元素为0。因此,独热编码后的向量可以表示为:

[1, 0, 0]
[0, 1, 0]
[0, 0, 1]

在这个例子中,第一个向量表示“猫”,第二个向量表示“狗”,第三个向量表示“鸟”。

使用TensorFlow识别MNIST

Softmax回归的原理

Softmax回归是一种用于多分类问题的回归方法。它的原理是将输出值变换成值为正且和为1的概率分布,从而得到每个类别的概率。这个概率可以看作是对每个类别的置信度,即该类别被预测为正类的概率。

在Softmax回归中,我们使用softmax函数来计算每个类别的概率。softmax函数的定义如下:

softmax ( x ) i = exp ⁡ ( x i ) ∑ j = 1 n exp ⁡ ( x j ) \text{softmax}(x)_i = \frac{\exp(x_i)}{\sum_{j=1}^n \exp(x_j)} softmax(x)i=j=1nexp(xj)exp(xi)

其中, x i x_i xi表示第i个输入特征, softmax ( x ) \text{softmax}(x) softmax(x)表示所有输入特征的softmax函数值。

Softmax回归的通俗解释

让我用一个通俗的例子结合公式来解释softmax。
假设你和两个朋友要一起去餐厅吃晚饭,并且有三个餐厅选项可供选择:餐厅A、餐厅B和餐厅C。为了决定去哪个餐厅,你们每个人对每个餐厅都进行评分,分数范围从1到10。
朋友A给餐厅A评分为7,对餐厅B评分为5,对餐厅C评分为3。
朋友B给餐厅A评分为8,对餐厅B评分为6,对餐厅C评分为4。
你给餐厅A评分为6,对餐厅B评分为4,对餐厅C评分为9。
现在,我们将使用softmax来计算每个餐厅被选中的概率。
首先,我们将每个朋友对每个餐厅的评分转化为指数化值。使用公式:
e^评分
根据公式,对于朋友A来说,餐厅A的指数化评分为e7,餐厅B的指数化评分为e5,餐厅C的指数化评分为e^3。同样地,我们可以计算朋友B和你对每个餐厅的指数化评分。
接下来,我们对每个餐厅的指数化评分求和。即将朋友A、朋友B和你对于每个餐厅的指数化评分进行相加。
然后,我们使用每个餐厅的指数化评分除以总和,得到每个餐厅被选中的概率。
例如,假设餐厅A的指数化评分之和为S,餐厅B的指数化评分之和为S2,餐厅C的指数化评分之和为S3:
餐厅A的选择概率 = S / (S + S2 + S3)
餐厅B的选择概率 = S2 / (S + S2 + S3)
餐厅C的选择概率 = S3 / (S + S2 + S3)
最终的结果就是每个餐厅被选中的概率。这样,你们可以依据每个餐厅的概率来做出最终的决定。
请注意,上述例子中的具体数字仅用于解释softmax的思想和过程,并不代表真实的计算结果。

Softmax的使用场景

Softmax函数通常在机器学习和深度学习中应用广泛。以下是一些常见的使用场景:

  1. 多分类问题:Softmax函数可以将多个输入值转化为表示各个类别概率的输出,适用于多类别分类任务。例如,图像分类中将图像分为不同的类别。
  2. 神经网络输出层:在神经网络的最后一层,Softmax函数常用于将神经元的输出转化为表示各个类别概率的形式。这样可以方便地对输入进行分类预测。
  3. 概率预测:由于Softmax函数输出的是概率分布,因此可以用于各种需要从给定选项中选择最可能的选项的任务。例如,语言模型中的下一个单词预测、机器翻译中的词汇选择等。
  4. 强化学习中的动作选择:在强化学习中,Softmax函数可用于基于动作价值估计来选择下一步的动作。将每个动作的估计值经过Softmax函数转化为选择概率,从而根据概率选择行动。
    总之,Softmax函数在需要将一系列输入值转化为表示概率分布的输出时非常有用,特别适用于多分类问题和概率预测任务。

Softmax 函数进行 MNIST 数据集的多分类

导入库和数据集:

import tensorflow as tf
from tensorflow.keras.datasets import mnist

# 加载 MNIST 数据集
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()

数据预处理:

# 将像素值归一化到 0-1 范围内
train_images = train_images / 255.0
test_images = test_images / 255.0

# 将标签转换为独热编码形式
train_labels = tf.keras.utils.to_categorical(train_labels, num_classes=10)
test_labels = tf.keras.utils.to_categorical(test_labels, num_classes=10)

构建模型:

# 定义模型结构
model = tf.keras.Sequential([
    tf.keras.layers.Flatten(input_shape=(28, 28)),
    tf.keras.layers.Dense(128, activation='relu'),
    tf.keras.layers.Dense(10, activation='softmax')
])

# 编译模型
model.compile(optimizer='adam',
              loss='categorical_crossentropy',
              metrics=['accuracy'])

训练模型:

# 模型训练
model.fit(train_images, train_labels, epochs=5, batch_size=32)
Epoch 1/5
1875/1875 [==============================] - 7s 3ms/step - loss: 0.2555 - accuracy: 0.9265
Epoch 2/5
1875/1875 [==============================] - 9s 5ms/step - loss: 0.1127 - accuracy: 0.9665
Epoch 3/5
1875/1875 [==============================] - 10s 5ms/step - loss: 0.0777 - accuracy: 0.9763
Epoch 4/5
1875/1875 [==============================] - 9s 5ms/step - loss: 0.0589 - accuracy: 0.9821
Epoch 5/5
1875/1875 [==============================] - 9s 5ms/step - loss: 0.0452 - accuracy: 0.9857





<keras.callbacks.History at 0x2a9800b7550>

评估模型:

# 在测试集上评估模型性能
test_loss, test_acc = model.evaluate(test_images, test_labels)
print('Test accuracy:', test_acc)
313/313 [==============================] - 2s 5ms/step - loss: 0.0758 - accuracy: 0.9763
Test accuracy: 0.9763000011444092

进行预测:

#先展示第一种图片作为辅助验证
plt.imshow(test_images[0])
plt.show()

png

# 对测试集进行预测
predictions = model.predict(test_images)
# 打印第一张图像的预测结果
print('Predicted label:', tf.argmax(predictions[0]))
# 获取最大值的索引
max_index = tf.argmax(predictions[0])
# 将索引转换为列表
result_list = max_index.numpy().tolist()
print(result_list)
Predicted label: tf.Tensor(7, shape=(), dtype=int64)
7

五层卷积+训练图象

import matplotlib.pyplot as plt
import numpy as np
import tensorflow as tf

# 加载MNIST数据集
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()

# 将像素值缩放到0-1之间
x_train, x_test = x_train / 255.0, x_test / 255.0

# 将标签转换为One-hot编码
y_train = tf.one_hot(y_train, depth=10)
y_test = tf.one_hot(y_test, depth=10)

# 构建模型
model = tf.keras.models.Sequential([
    tf.keras.layers.Reshape((28, 28, 1), input_shape=(28, 28)),
    tf.keras.layers.Conv2D(filters=32, kernel_size=(3, 3), activation='relu'),
    tf.keras.layers.MaxPooling2D(pool_size=(2, 2)),
    tf.keras.layers.Conv2D(filters=64, kernel_size=(3, 3), activation='relu'),
    tf.keras.layers.MaxPooling2D(pool_size=(2, 2)),
    tf.keras.layers.Conv2D(filters=128, kernel_size=(3, 3), activation='relu'),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(256, activation='relu'),
    tf.keras.layers.Dense(10, activation='softmax')
])

# 编译模型
model.compile(optimizer='adam',
              loss='categorical_crossentropy',
              metrics=['accuracy'])

# 训练模型
history = model.fit(x_train, y_train, validation_data=(x_test, y_test), epochs=2)
Epoch 1/2
1875/1875 [==============================] - 21s 10ms/step - loss: 0.1172 - accuracy: 0.9644 - val_loss: 0.0400 - val_accuracy: 0.9862
Epoch 2/2
1875/1875 [==============================] - 19s 10ms/step - loss: 0.0419 - accuracy: 0.9871 - val_loss: 0.0476 - val_accuracy: 0.9849
# 绘制训练和验证的准确率曲线
plt.plot(history.history['accuracy'], label='accuracy')
plt.plot(history.history['val_accuracy'], label='val_accuracy')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.legend()
plt.show()

png


# 随机选择一张测试图像进行预测
index = np.random.randint(0, len(x_test))
image = x_test[index]
label = y_test[index]

# 进行预测
pred = model.predict(np.expand_dims(image, axis=0))[0]
pred_label = np.argmax(pred)
# 进行预测
pred = model.predict(np.expand_dims(image, axis=0))[0]
pred_label = np.argmax(pred)

# 显示图像和预测结果
plt.imshow(image, cmap='gray')
plt.title('True label: {} / Predicted label: {}'.format(np.argmax(label), pred_label))
plt.show()

png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/659310.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【干货】Android系统定制基础篇:第七部分-Android OTA升级(系统、应用)

OTA升级应用 项目地址&#xff1a;https://github.com/aystshen/Android-RomUpgrade. 这是一个负责 Android OTA 升级的后台应用&#xff0c;开机后自动运行后台 Service&#xff0c;支持系统升级和应用升级&#xff0c;支持本地升级&#xff08;tf卡、u盘&#xff09;和在线升…

数据库系统概述——第一章 绪论(知识点复习+练习题)

✨博主&#xff1a;命运之光 &#x1f984;专栏&#xff1a;离散数学考前复习&#xff08;知识点题&#xff09; &#x1f353;专栏&#xff1a;概率论期末速成&#xff08;一套卷&#xff09; &#x1f433;专栏&#xff1a;数字电路考前复习 &#x1f99a;专栏&#xff1a;数…

Qt 每月收支计算

Qt 每月收支计算&#xff0c;针对每月有支出&#xff08;房贷、车贷、花呗、借呗&#xff09;的情况&#xff0c;计算收支明细&#xff0c;直观看到未来的个人经济情况&#xff0c;培养良好的消费习惯&#xff0c;进行理性的财富支配&#xff0c;量入为出。 #include "mai…

云安全技术(三)之云计算相关的安全概念

云计算相关的安全概念 Security Concepts Relevant to Cloud Computing 1. 密码学和密钥管理 Cryptography and key management 1、加密技术: 有许多不同类型和等级的加密技术。在云环境中&#xff0c;云安全专家有责任评价应用程序的需求、所使用的技术、需要保护的数据类型&…

【UE 从零开始制作坦克】5-通过旋转摄像机控制炮塔旋转

效果 步骤 打开动画蓝图“ABP_West_Tank_M1A1Abrams” 我们在动画图表中可以发现控制坦克炮塔旋转和炮管旋转的变量分别是“TurretRotation”和“GunRotattion”&#xff0c;因此只需改变这两个旋转体的值即可控制炮塔和炮管的旋转。 切换到事件图表中&#xff0c;首先通过“T…

单向散列函数【密码学】(一)

目录 一、前言&#xff1a;密码学有什么用&#xff1f; 二、单向散列函数 1、单向函数 2、散列函数 3、单向散列函数 三、怎么解决完整性问题 四、如何设置合适的安全强度 一、前言&#xff1a;密码学有什么用&#xff1f; 二、单向散列函数 单向散列函数就是用来解决…

article-6-pss 并联六自由度机构轨迹规划

建模 ** [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-djltxj90-1687070335773)(data:image/svgxml;utf8, )] ** 程序如下&#xff1a; % clc % clear all % function []PSS1(XP,YP,ZP) tic %%%%%鍒濆浣嶇疆鐨勪綅濮?%%%%% % XP 0; %鍔ㄥ钩鍙…

存储笔记6 SAN

SAN&#xff08;Storage Area Networks&#xff09; SAN 优势 benefitsSAN 组件 componentsSAN连接选项 connective optionsFC协议 FC寻址 protocol addressing\FC拓扑 topologie SAN优缺点 光纤通道 fibre channel SAN组件 FC三种互联 FC端口类型 fabric 企业需要和科技…

RFID期末复习总结

一.概念部分 1.基础概念 射频识别无线电频率识别RFID 应答器&#xff1a;存放识别信息的电子数据载体 阅读器&#xff1a;将识别信息从应答器中读出&#xff08;还可以写入数据&#xff09; 应答器是统称&#xff0c;在各种专业场合有专业名字&#xff0c;比如射频卡&#…

pikachu靶场-PHP反序列化

在理解这个漏洞前,你需要先搞清楚php中serialize()&#xff0c;unserialize()这两个函数。 序列化serialize() 序列化说通俗点就是把一个对象变成可以传输的字符串,比如下面是一个对象: class S{public $test"pikachu";}$snew S(); //创建一个对象serialize($s); //…

FPGA时序约束--进阶篇(主时钟约束)

在FPGA设计中&#xff0c;时序约束的设置对于电路性能和可靠性都至关重要。在上一篇的文章中&#xff0c;已经详细介绍了FPGA时序约束的基础知识。 本文将重点讲解主时钟约束设置&#xff0c;给出详细的约束命令&#xff0c;并介绍了在Vivado中如何写入主时钟约束。 一、主时…

一文详解!接口测试(http与rpc)总结

目录 前言&#xff1a; 一、了解一下HTTP与RPC 二、HTTP接口测试 三、RPC接口测试 四、接口测试用例设计 五、测试思路总结 前言&#xff1a; 在接口测试方面&#xff0c;常见的接口类型有HTTP接口和RPC接口。这两者的测试方法略有不同&#xff0c;在测试前需要进行技术选…

[INFO] [copilotIgnore] inactive,github copilot没反应怎么解决

在使用github copilot的时候&#xff0c;插件不工作&#xff0c;后台出现了这种输出&#xff0c; 这种情况下就是它的激活出现了问题&#xff0c;如果账号的使用权没有问题的话&#xff0c;就将该插件disable之后再重新enable&#xff0c;重新观察输出&#xff0c;就会看到copi…

LAMP架构搭建实操

目录 一、LAMP架构概述 二、LAMP框架搭建 1.准备工作 2.部署apache 3.部署mysql 4.部署php 三、部署BBS论坛 一、LAMP架构概述 LAMP架构是目前成熟的企业网站应用模式之一&#xff0c;指的是协同工作的一整套系统和相关软件&#xff0c;能够提供动态Web站点服务及其应用…

win11系统提示msvcp140.dll丢失的三个解决方法,简单实用

Win11系统在运行photoshop或其他软件&#xff0c;游戏的时候&#xff0c;电脑提示“找不到msvcp140.dll”&#xff0c;“msvcp140.dll丢失”&#xff0c;“无法定位输入点msvcp140.dll”等问题&#xff0c;都是由于Windows11系统中的msvcp140.dll文件丢失或者损坏了。 问题场景…

数据结构 串

串 术语概念 在数据结构中&#xff0c;串&#xff08;String&#xff09;是由零个或多个字符组成的有限序列。它是一种常见的数据类型&#xff0c;常用于表示文本、字符串和符号序列等信息。串可以包含任意字符&#xff0c;包括字母、数字、符号以及空格等。 主串&#xff08…

CANDENCE : 如何绘制元器件

如何绘制元器件 绘制元器件之前先新建一个原理图库。 step1:打开某一个原理图工程 step2:在该工程系下新建一个库文件&#xff0c;如下图&#xff1a; 新建完成&#xff0c;如下图&#xff1a; 右键点击保存&#xff1a;save。 命名并保存&#xff0c;保存的位置自己决定 …

AI - stable-diffusion 艺术化二维码

系列文章&#xff1a; 《AI - stable-diffusion(AI 绘画)的搭建与使用》《AI - AI 绘画的精准控图(ControlNet)》 一、介绍 近日&#xff0c;AI 绘画&#xff08;stable-diffusion&#xff09;用来艺术化二维码算是比较火热的事了&#xff0c;这个 idea 是由国人用 Checkpoi…

Spring Security 实战篇

文章目录 前言内存版(memory)数据库库版(jdbc)自定义登录 - 单体&#xff08;custom-login-single&#xff09;自定义登录 - 前后分离会话一致性方案方案一方案二方案三为什么不用JWT 登录改json方式登录&#xff08;custom-login-json&#xff09;认证密码加密登录&#xff08…

【欧瑞博智能家居】ZigBee Mini网关、超静音智能开合帘电机 添加操作流程

目录 一、添加ZigBee Mini网关 二、添加超静音智能开合帘电机 参考资料 一、添加ZigBee Mini网关 1. 下载《智家365》APP 2. 网关通电&#xff0c;用网线连接路由器的网线接口 3. 再次扫描产品手册里面的二维码添加ZigBee Mini网关&#xff0c;注意手机wifi要在同一个网络…