卷积神经网络实现MNIST数据集分类
时间: 2023-09-04 21:07:56 浏览: 127
MNIST数据集是一个手写数字识别数据集,它是机器学习领域的经典数据集之一。下面我们将使用卷积神经网络(Convolutional Neural Network, CNN)来实现MNIST数据集的分类。
首先,我们需要导入必要的库和MNIST数据集。可以使用TensorFlow内置的tf.keras.datasets模块来加载MNIST数据集。
```python
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到1的范围内,并将输入数据的形状从28x28调整为1x28x28。这是因为CNN需要输入一个三维张量,其中第一维是样本数,第二维和第三维是图像的高度和宽度。
```python
# 对输入数据进行预处理
x_train = x_train.astype("float32") / 255.0
x_test = x_test.astype("float32") / 255.0
x_train = tf.expand_dims(x_train, -1)
x_test = tf.expand_dims(x_test, -1)
```
接下来,我们将定义一个简单的卷积神经网络。它由两个卷积层和两个全连接层组成。每个卷积层后面跟着一个最大池化层,以减少特征图的尺寸。最后一个全连接层的输出是10,与MNIST数据集的类别数相同。
```python
# 定义卷积神经网络
model = keras.Sequential(
[
keras.Input(shape=(28, 28, 1)),
layers.Conv2D(32, kernel_size=(3, 3), activation="relu"),
layers.MaxPooling2D(pool_size=(2, 2)),
layers.Conv2D(64, kernel_size=(3, 3), activation="relu"),
layers.MaxPooling2D(pool_size=(2, 2)),
layers.Flatten(),
layers.Dropout(0.5),
layers.Dense(10, activation="softmax"),
]
)
```
接下来,我们将编译模型并训练它。我们将使用Adam优化器和交叉熵损失函数。
```python
# 编译模型
model.compile(loss="sparse_categorical_crossentropy", optimizer="adam", metrics=["accuracy"])
# 训练模型
model.fit(x_train, y_train, batch_size=128, epochs=5, validation_split=0.1)
```
最后,我们将在测试集上评估模型的性能。
```python
# 评估模型
score = model.evaluate(x_test, y_test, verbose=0)
print("Test loss:", score[0])
print("Test accuracy:", score[1])
```
完整的代码如下所示:
```python
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()
# 对输入数据进行预处理
x_train = x_train.astype("float32") / 255.0
x_test = x_test.astype("float32") / 255.0
x_train = tf.expand_dims(x_train, -1)
x_test = tf.expand_dims(x_test, -1)
# 定义卷积神经网络
model = keras.Sequential(
[
keras.Input(shape=(28, 28, 1)),
layers.Conv2D(32, kernel_size=(3, 3), activation="relu"),
layers.MaxPooling2D(pool_size=(2, 2)),
layers.Conv2D(64, kernel_size=(3, 3), activation="relu"),
layers.MaxPooling2D(pool_size=(2, 2)),
layers.Flatten(),
layers.Dropout(0.5),
layers.Dense(10, activation="softmax"),
]
)
# 编译模型
model.compile(loss="sparse_categorical_crossentropy", optimizer="adam", metrics=["accuracy"])
# 训练模型
model.fit(x_train, y_train, batch_size=128, epochs=5, validation_split=0.1)
# 评估模型
score = model.evaluate(x_test, y_test, verbose=0)
print("Test loss:", score[0])
print("Test accuracy:", score[1])
```
运行代码后,你应该会看到模型在测试集上的准确率约为99%。
阅读全文