用cnn算法实现手写数字识别,要求:使用mnist数据集,使用python语言,评价指标包括overall accuracy,precision,recall,f1-score,训练用时和测试用时,关键步骤有注释说明。请给出代码
时间: 2024-03-04 08:47:49 浏览: 16
好的,以下是使用CNN算法实现手写数字识别的Python代码,注释说明在代码中:
```python
import numpy as np
import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras import backend as K
# 定义输入图像的尺寸和类别数
img_rows, img_cols = 28, 28
num_classes = 10
# 加载MNIST数据集并进行预处理
(x_train, y_train), (x_test, y_test) = mnist.load_data()
if K.image_data_format() == 'channels_first':
x_train = x_train.reshape(x_train.shape[0], 1, img_rows, img_cols)
x_test = x_test.reshape(x_test.shape[0], 1, img_rows, img_cols)
input_shape = (1, img_rows, img_cols)
else:
x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1)
x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1)
input_shape = (img_rows, img_cols, 1)
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255
# 将类别标签转换为独热编码格式
y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)
# 定义CNN模型
model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3),
activation='relu',
input_shape=input_shape))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes, activation='softmax'))
# 编译模型
model.compile(loss=keras.losses.categorical_crossentropy,
optimizer=keras.optimizers.Adadelta(),
metrics=['accuracy'])
# 训练模型
model.fit(x_train, y_train,
batch_size=128,
epochs=12,
verbose=1,
validation_data=(x_test, y_test))
# 评估模型
score = model.evaluate(x_test, y_test, verbose=0)
# 输出评估结果
print('Test loss:', score[0])
print('Test accuracy:', score[1])
```
在上述代码中,我们首先加载MNIST数据集,并对数据进行预处理,将输入图像的像素值缩放到0到1之间,将类别标签转换为独热编码格式。
然后,我们定义CNN模型,包括两个卷积层、一个池化层、两个Dropout层和两个全连接层。
接下来,我们编译模型,指定损失函数、优化器和评价指标,然后使用训练数据对模型进行训练。
最后,我们使用测试数据对模型进行评估,并输出评估结果。