识别手写数字(0-9)的深度学习模型

1.直接下载mnist.npz

# 导入所需的库  
import tensorflow as tf  
import numpy as np  
import matplotlib.pyplot as plt  
  
# 加载MNIST数据集,分为训练集和测试集  
# x_train/y_train 是训练集的图片和标签  
# x_test/y_test 是测试集的图片和标签  
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()  
  
# 查看第一张图片的形状,MNIST图片是28x28像素的灰度图  
image = x_train[1]  
print(image.shape)  # 输出应该是 (28, 28)  
  
# 取消注释以下两行可以查看第一张图片  
# plt.imshow(image, cmap='gray')  # 使用灰度图模式显示  
# plt.show()  
  
# 取消注释以下一行可以查看第一张图片对应的标签(数字)  
# print(y_train[1])  
  
# 将标签转换为one-hot编码,用于分类任务  
# 例如,数字5将被转换为 [0, 0, 0, 0, 0, 1, 0, 0, 0, 0]  
y_train_one_hot = tf.one_hot(y_train, 10)  
  
# 取消注释以下三行可以查看one-hot编码后的形状、原始训练集形状和第一张图片的one-hot编码  
# print(y_train_one_hot.shape)  
# print(x_train.shape)  
# print(y_train_one_hot[1])  
  
# 定义一个Sequential模型  
model = tf.keras.Sequential([  
    # 将28x28的图片展平为一维向量  
    tf.keras.layers.Flatten(),  
    # 添加一个全连接层,有128个神经元,使用ReLU激活函数  
    tf.keras.layers.Dense(128, activation="relu"),  
    # 再添加两个全连接层,分别有64和32个神经元,都使用ReLU激活函数  
    tf.keras.layers.Dense(64, activation="relu"),  
    tf.keras.layers.Dense(32, activation="relu"),  
    # 注意:这里通常不需要一个18个神经元的层,除非有特别的理由。这里可能是个错误,通常我们会直接连接到输出层  
    # 但为了保持代码的一致性,我保留了这个层  
    tf.keras.layers.Dense(18, activation="relu"),  
    # 输出层,10个神经元对应10个类别,使用softmax激活函数进行多分类  
    tf.keras.layers.Dense(10, activation="softmax"),  
])  
  
# 构建模型,指定输入的形状为 (None, 28, 28),其中None表示批次大小可以是任意的  
model.build(input_shape=(None, 28, 28))  
  
# 打印模型的结构摘要  
model.summary()  
  
# 编译模型,指定优化器、损失函数和评估指标  
# 注意:这里使用了两个CategoricalCrossentropy,通常我们只需要一个作为损失函数,另一个可以替换为accuracy作为评估指标  
model.compile(optimizer=tf.keras.optimizers.Adam(),   
              loss=tf.keras.losses.CategoricalCrossentropy(),   
              metrics=[tf.keras.metrics.Accuracy()])  # 修改为Accuracy作为评估指标  
  
# 训练模型,使用训练集的图片和one-hot编码的标签,训练10个epoch  
history = model.fit(x_train, y_train_one_hot, epochs=10)  
  
# 提取训练过程中的损失值  
LOSS = history.history["loss"]  
  
# 绘制损失值随epoch变化的曲线  
plt.plot(LOSS)  
plt.title('Training Loss')  
plt.xlabel('Epoch')  
plt.ylabel('Loss')  
plt.show()  
  
# 对测试集进行预测,并找到概率最大的类别(即预测的标签)  
# 注意:这里使用了np.argmax来获取最大值的索引,即预测的类别  
predictions = np.argmax(model.predict(x_test), axis=1)[:10]  
  
# 打印前10个测试样本的预测标签和真实标签  
print("Predicted labels:", predictions)  
print("True labels:", y_test[:10])
  1. 数据加载:使用TensorFlow的内置数据集mnist加载手写数字图片和对应的标签。mnist数据集包含了60,000个训练样本和10,000个测试样本,每个样本都是一张28x28像素的灰度图片。

  2. 数据预处理:将标签从整数形式转换为one-hot编码形式,以便模型进行多分类任务。例如,数字5将被转换为[0, 0, 0, 0, 0, 1, 0, 0, 0, 0]。

  3. 模型构建:使用TensorFlow的Sequential API定义了一个简单的神经网络模型。这个模型由几个全连接层(Dense层)组成,每个层都使用了ReLU激活函数(除了输出层使用了softmax激活函数)。模型的输入是展平后的28x28像素图片,输出是10个类别的概率分布。

  4. 模型编译:配置了模型的训练过程,包括优化器(这里使用了Adam优化器)、损失函数(这里使用了分类交叉熵损失函数CategoricalCrossentropy)和评估指标(这里使用了准确率Accuracy)。

  5. 模型训练:使用训练数据对模型进行训练,通过调整模型的参数来最小化损失函数。这里训练了10个epoch。

  6. 结果评估:使用测试数据对模型进行评估,计算了模型在测试集上的损失值,并绘制了损失随epoch变化的曲线。此外,还使用模型对测试集进行了预测,并打印了前10个样本的预测标签和真实标签,以便比较模型的性能。

2.从文件中寻找mnist.npz

可在网上自行下载。

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

# (x_train,y_train),(x_test,y_test)=tf.keras.datasets.mnist.load_data()
with np.load("mnist.npz") as f:
    x_train, y_train = f['x_train'], f['y_train']
    x_test, y_test = f['x_test'], f['y_test']
y_train_one_hot = tf.one_hot(y_train, 10).numpy()[:2000]
x_train = np.float32(x_train[:2000, :, :])
print(x_train.shape)
# print(y_train_one_hot[3])
# image=x_train[3]
# plt.imshow(image)
# plt.show()

model = tf.keras.Sequential([
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(256, activation="relu"),
    tf.keras.layers.Dense(128, activation="relu"),
    tf.keras.layers.Dense(64, activation="relu"),
    tf.keras.layers.Dense(32, activation="relu"),
    tf.keras.layers.Dense(10, activation="softmax")
])

model.build(input_shape=[None, 28, 28])
model.summary()
model.compile(optimizer=tf.keras.optimizers.Adam(), loss=tf.keras.losses.CategoricalCrossentropy(),
              metrics=[tf.keras.losses.CategoricalCrossentropy()])
history = model.fit(x_train, y_train_one_hot, epochs=5)
LOSS = history.history["loss"]
plt.plot(LOSS)
plt.show()
print(np.argmax(model.predict(x_test), axis=1)[:10])
print(y_test[:10])

3.结果

epochs=10,损失函数降至0.0632

epochs=20,损失函数降至0.0336

epochs=30,损失函数降至0.0201

4.测试图片

# 假设我们想要测试训练集中的第3张图片
index = 3
test_image = x_train[index]  # 这里我们使用训练集的图片作为示例

# 归一化图片数据到0-1范围
test_image = test_image.astype('float32') / 255.0

# 扩展维度以适应模型的输入
test_image = np.expand_dims(test_image, axis=0)

# 使用模型进行预测
predictions = model.predict(test_image)

# 预测结果是一个概率分布,我们选择概率最高的类别
predicted_class = np.argmax(predictions)

# 输出预测结果和原始标签
print(f"Predicted class: {predicted_class}")
print(f"Original label: {y_train[index]}")

# 如果想要可视化预测的图片
plt.imshow(test_image[0], cmap='gray')
plt.title(f"Predicted: {predicted_class}")
plt.axis('off')
plt.show()

原始数据为1,预测数据为1

原始数据为0,预测数据为5

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: scikit-learn是一个Python机器学习库,其中包含了许多常用的机器学习算法和工具。其中之一是手写数字识别,它可以用于识别手写数字的图像。这个功能可以通过使用scikit-learn中的支持向量机(SVM)算法来实现。SVM是一种强大的分类算法,可以用于处理高维数据,并且在处理图像和文本等非结构化数据时表现良好。在使用SVM进行手写数字识别时,我们需要将图像转换为数字向量,并使用训练数据来训练模型。一旦模型训练完成,我们就可以使用它来预测新的手写数字图像的标签。 ### 回答2: scikit-learn是一个用于机器学习的Python库,它与NumPy和SciPy一起组成了Python科学计算的核心三个库之一。其中,scikit-learn具有非常强大的特征,例如分类、回归、聚类和降维等算法支持,以及交叉验证、模型选择和数据预处理等方便的功能。在机器学习中,手写数字识别一直是一个重要的应用场景,而scikit-learn提供的mnist数据集,则是实现手写数字识别的基础。 mnist数据集由70,000张28x28像素的手写数字图像组成,其中,60,000张用于训练模型10,000张用于测试模型。在Python代码中,可以使用sklearn.datasets.load_digits()方法加载mnist数据集。加载完成后,数据集可以使用train_test_split()方法进行切分,将数据集分为训练集和测试集。同时,图像的像素点可以通过reshape()方法转换为二维数组。 在手写数字识别中,使用的是分类算法,sklearn中提供了多种分类算法,包括决策树、随机森林、KNN等。例如使用随机森林,可以通过建立RandomForestClassifier()实例来训练模型,使用fit()方法进行训练,并使用predict()方法进行预测。同时,可以通过score()方法输出模型在测试数据上的准确率。 在实际使用中,手写数字识别可以通过图形界面或者Web应用进行展示。例如,可以使用Python的Tkinter库或者Django等Web框架来构建图形界面或者Web应用。 需要注意的是,手写数字识别一个非常常见的机器学习应用场景,也被广泛应用于硬件控制、智能安防的开发中,模型训练和调参需要根据实际场景灵活调整,从而达到更好的识别效果。 ### 回答3: scikit-learn手写数字识别是一种常用的机器学习模型,它使用Python语言和scikit-learn包来实现。该模型可以通过输入手写数字图像并使用分类算法来识别这些图像所代表的数字手写数字识别在许多领域都有应用,例如安全验证、自动邮递处理和医学图像识别等。 在实现手写数字识别模型时,首先需要准备训练数据集和测试数据集。训练数据集通常包含一系列已知的手写数字图像和它们所对应的数字标签。测试数据集包含一系列不同的手写数字图像,用于测试模型的分类效果。 接下来,需要通过特征提取来将手写数字图像转化为数值特征。通常使用的特征提取方法包括图像切割、边缘检测、色彩模型等。在这个步骤中,需要将所有的手写数字图像转换为归一化的、相同大小的灰度图像,并用特定的算法提取出每个图像的特征值。 然后,使用scikit-learn提供的分类器(例如K-近邻算法或支持向量机算法)对输入的手写数字图像进行分类。训练数据集和测试数据集分别用于模型训练和测试,可以通过调整算法参数和模型参数来进一步提高分类效果。 最后,使用训练好的模型对新的手写数字图像进行分类,得到它们所代表的数字值。除了通过界面输入图像外,还可以通过其他途径的图片的读取,转模型时需要注意对数据进行预处理。 总的来说,scikit-learn手写数字识别是一种强大的机器学习模型,并且可以使用Python语言进行实现。它的准确性和可扩展性都非常高,在许多领域都有广泛的应用前景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

香克斯的格里芬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值