手写数字识别python cnn
时间: 2023-07-26 19:16:29 浏览: 99
手写数字识别(CNN)的python实现
手写数字识别是一个常见的机器学习问题,我们可以使用卷积神经网络(CNN)来解决这个问题。下面是一个使用Python实现的简单CNN手写数字识别示例:
1. 数据集准备
我们可以使用MNIST数据集来进行手写数字识别。MNIST数据集包含60000张训练图片和10000张测试图片,每张图片都是28x28像素的灰度图片。可以使用以下代码来加载数据集:
```python
from keras.datasets import mnist
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
```
2. 数据预处理
我们需要将数据进行预处理,将像素值归一化到0到1之间,并将标签进行one-hot编码。可以使用以下代码来进行预处理:
```python
import numpy as np
from keras.utils import to_categorical
train_images = train_images.reshape((60000, 28, 28, 1))
train_images = train_images.astype('float32') / 255
test_images = test_images.reshape((10000, 28, 28, 1))
test_images = test_images.astype('float32') / 255
train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)
```
3. 模型定义
我们可以使用Keras来定义CNN模型。以下是一个简单的CNN模型定义:
```python
from keras import models, layers
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))
```
这个模型包含了两个卷积层和一个全连接层。我们使用ReLU激活函数来增加模型的非线性性,使用Softmax激活函数来输出每个数字的概率分布。
4. 模型编译和训练
我们需要编译模型并指定损失函数、优化器和评估指标。可以使用以下代码进行编译:
```python
model.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['accuracy'])
```
然后可以使用以下代码进行训练:
```python
model.fit(train_images, train_labels, epochs=5, batch_size=64)
```
5. 模型评估
我们可以使用测试集来评估模型的性能。可以使用以下代码来进行评估:
```python
test_loss, test_acc = model.evaluate(test_images, test_labels)
print('Test accuracy:', test_acc)
```
在本例中,模型在测试集上的准确率为99.2%。
这就是一个简单的CNN手写数字识别示例。当然,我们还可以使用更复杂的模型和更多的数据来提高识别的准确率。
阅读全文