基于python实现LeNet5的MNIST手写字体识别
时间: 2023-12-09 13:03:58 浏览: 24
好的,下面是基于Python实现LeNet5的MNIST手写字体识别的详细步骤。
首先,我们需要准备以下工具和库:
- Python 3.x
- TensorFlow 2.x
- Keras
- NumPy
- Matplotlib
接下来,我们按照以下步骤来完成MNIST手写字体识别任务。
1. 导入必要的库和模块
首先,我们需要导入必要的库和模块,包括NumPy、Matplotlib、TensorFlow和Keras等。
```python
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
```
2. 加载MNIST数据集
然后,我们需要加载MNIST数据集,并将其分为训练集和测试集。我们可以使用Keras中的`load_data()`函数来加载MNIST数据集,并使用NumPy中的`reshape()`函数将图像数据转换为`28x28x1`的形状。
```python
(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()
# 将图像数据从[0,255]归一化到[0,1]之间
x_train = x_train.astype("float32") / 255.0
x_test = x_test.astype("float32") / 255.0
# 将图像数据转换为(28,28,1)的形状
x_train = np.reshape(x_train, (-1, 28, 28, 1))
x_test = np.reshape(x_test, (-1, 28, 28, 1))
```
3. 定义LeNet5模型
接下来,我们需要定义LeNet5模型。LeNet5模型包括两个卷积层、两个池化层和三个全连接层。我们可以使用Keras中的`Sequential()`函数来定义LeNet5模型,并使用`Conv2D()`、`MaxPooling2D()`和`Dense()`函数来添加卷积层、池化层和全连接层。
```python
model = keras.Sequential(
[
layers.Conv2D(filters=6, kernel_size=(3, 3), activation="relu", input_shape=(28, 28, 1)),
layers.MaxPooling2D(pool_size=(2, 2)),
layers.Conv2D(filters=16, kernel_size=(3, 3), activation="relu"),
layers.MaxPooling2D(pool_size=(2, 2)),
layers.Flatten(),
layers.Dense(units=120, activation="relu"),
layers.Dense(units=84, activation="relu"),
layers.Dense(units=10, activation="softmax"),
]
)
```
4. 编译模型并训练
接着,我们需要编译模型,并使用`fit()`函数来训练模型。在编译模型时,我们需要指定损失函数、优化器和评估指标。在训练模型时,我们需要指定训练数据、训练次数和批次大小等参数。
```python
model.compile(optimizer="adam", loss="sparse_categorical_crossentropy", metrics=["accuracy"])
model.fit(x_train, y_train, epochs=5, batch_size=32, validation_split=0.1)
```
5. 评估模型性能
最后,我们需要使用测试集来评估模型的性能。我们可以使用`evaluate()`函数来计算模型在测试集上的损失和准确率。
```python
test_loss, test_acc = model.evaluate(x_test, y_test)
print("Test accuracy:", test_acc)
```
完整代码如下:
```python
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
# 加载MNIST数据集
(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()
# 将图像数据从[0,255]归一化到[0,1]之间
x_train = x_train.astype("float32") / 255.0
x_test = x_test.astype("float32") / 255.0
# 将图像数据转换为(28,28,1)的形状
x_train = np.reshape(x_train, (-1, 28, 28, 1))
x_test = np.reshape(x_test, (-1, 28, 28, 1))
# 定义LeNet5模型
model = keras.Sequential(
[
layers.Conv2D(filters=6, kernel_size=(3, 3), activation="relu", input_shape=(28, 28, 1)),
layers.MaxPooling2D(pool_size=(2, 2)),
layers.Conv2D(filters=16, kernel_size=(3, 3), activation="relu"),
layers.MaxPooling2D(pool_size=(2, 2)),
layers.Flatten(),
layers.Dense(units=120, activation="relu"),
layers.Dense(units=84, activation="relu"),
layers.Dense(units=10, activation="softmax"),
]
)
# 编译模型并训练
model.compile(optimizer="adam", loss="sparse_categorical_crossentropy", metrics=["accuracy"])
model.fit(x_train, y_train, epochs=5, batch_size=32, validation_split=0.1)
# 评估模型性能
test_loss, test_acc = model.evaluate(x_test, y_test)
print("Test accuracy:", test_acc)
```
运行以上代码,就可以训练LeNet5模型,并使用测试集来评估模型的性能。