Python进阶教程:使用机器学习实现手写数字识别
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Python进阶教程:使用机器学习实现手写数字识别
在日常生活中,我们经常需要手写数字,包括填写表格、汽车牌照等等,然而如何让计算机识别手写数字成了一个问题。随着机器学习的发展,使用Python编写代码实现手写数字识别已经不再是一个难题。本文主要介绍如何使用机器学习实现手写数字识别,其中包括数据预处理、模型构建以及模型训练等步骤。
一、数据预处理
在进行手写数字识别前,我们需要获取训练数据和测试数据。这里,我们选用了著名的MNIST数据集。该数据集包含60,000张训练图像和10,000张测试图像,图像大小均为28x28,像素值为0-255的灰度值。我们可以使用Python中的numpy和matplotlib库来读取和显示图像。代码如下:
```python
import numpy as np
import matplotlib.pyplot as plt
# 读取训练数据
train_images = np.load('mnist_train_images.npy')
train_labels = np.load('mnist_train_labels.npy')
# 读取测试数据
test_images = np.load('mnist_test_images.npy')
test_labels = np.load('mnist_test_labels.npy')
# 显示第一张图像和其标签
plt.imshow(train_images[0], cmap='gray')
plt.title('Label: ' + str(train_labels[0]))
plt.show()
```
我们可以看到,第一张训练图像对应的标签是5。使用同样的方法,我们可以查看其他图像以及其标签。
我们可以将每个28x28的图像展开成784维的向量,这样更方便我们后续的处理。同时,由于像素值已经在0-255的范围内,我们可以将其归一化到0-1的范围。代码如下:
```python
# 将图像展开成一维向量,并归一化
train_images = train_images.reshape(-1, 28*28) \/ 255.0
test_images = test_images.reshape(-1, 28*28) \/ 255.0
```
我们还要注意到,在进行机器学习训练过程中,我们需要将数据集分成训练集和验证集。一般来说,我们将60,000张训练图像中的前50,000张作为训练集,后10,000张作为验证集。代码如下:
```python
# 将训练数据分成训练集和验证集
train_images_train = train_images[:50000]
train_labels_train = train_labels[:50000]
train_images_val = train_images[50000:]
train_labels_val = train_labels[50000:]
```
二、模型构建
在进行模型构建前,我们需要了解机器学习中常用的分类算法。常见的分类算法包括逻辑回归、决策树、支持向量机和神经网络等。而在本文中,我们将使用神经网络模型。
神经网络模型由输入层、中间层和输出层组成。在手写数字识别中,输入
层有784个神经元,对应28x28的图像。输出层有10个神经元,对应0-9的10个数字。我们可以采用多个中间层来提高模型性能,这里我们选用了两个中间层,分别包含128个和64个神经元。
代码如下:
```python
import tensorflow.keras as keras
# 构建神经网络模型
model = keras.Sequential([
yers.Dense(128, activation='relu', input_shape=(784,)), yers.Dense(64, activation='relu'),
yers.Dense(10, activation='softmax')
])
```
三、模型训练
构建完模型后,我们需要定义损失函数和优化器,同时设置训练批次大小、训练轮数等参数。在本文中,我们采用交叉熵损失函数和Adam优化器。代码如下:
```python
#编译模型
pile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
# 设置训练参数
batch_size = 128
epochs = 10
# 训练模型
history = model.fit(train_images_train, keras.utils.to_categorical(train_labels_train),
batch_size=batch_size, epochs=epochs, validation_data=(train_images_val,
keras.utils.to_categorical(train_labels_val)))
```
在训练过程中,我们还可以打印出模型在训练集和验证集上的准确率和损失值,以及可视化训练过程中的准确率和损失变化情况。代码如下:
```python
# 输出模型在训练集和验证集上的准确率和损失值
train_loss, train_accuracy = model.evaluate(train_images_train, keras.utils.to_categorical(train_labels_train), verbose=1)
val_loss, val_accuracy = model.evaluate(train_images_val, keras.utils.to_categorical(train_labels_val), verbose=1)
print('Training loss:', train_loss)
print('Training accuracy:', train_accuracy)
print('Validation loss:', val_loss)
print('Validation accuracy:', val_accuracy)
# 可视化训练过程中的准确率和损失变化情况
plt.plot(history.history['accuracy'], label='Training accuracy') plt.plot(history.history['val_accuracy'], label='Validation accuracy')
plt.title('Training and validation accuracy')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.legend()
plt.show()
plt.plot(history.history['loss'], label='Training loss')