手写数字体识别-keras实现

手写数字体识别-keras实现

前言

Keras入门,手写数字体识别
环境:
win10 gtx1660ti

tensorflow-gpu==1.13.1  keras==2.2.4

使用全连接层

首先加载mnist数据集,对数据进行预处理,由于使用全连接层,所以先将(28,28)的训练图片铺平为28﹡28的向量,而神经网络的输入取值较小,因此归一化为(0,1)之间的浮点型。对于标签,使用one-hot编码,与神经网络的输出对应。
模型由两层构成,第一层有512个神经元,激活函数为relu,输入形状为(28﹡28,),输出层有10个神经元,激活函数为softmax。然后编译模型,训练与评估模型。
完整代码:

from keras.datasets import mnist
from keras import models
from keras.layers import Dense
from keras.utils import to_categorical

# 加载数据
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()

# 数据预处理
train_images = train_images.reshape((60000, 28 * 28))
train_images = train_images.astype('float32') / 255
test_images = test_images.reshape((10000, 28 * 28))
test_images = test_images.astype('float32') / 255

train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)

# model
model = models.Sequential()
model.add(Dense(512, activation='relu', input_shape=(28 * 28,)))
model.add(Dense(10, activation='softmax'))

# 编译模型
model.compile(optimizer='rmsprop',
              loss='categorical_crossentropy',
              metrics=['accuracy'])

# train
model.fit(train_images, train_labels, epochs=5, batch_size=128)

# evaluate
test_loss, test_acc = model.evaluate(test_images, test_labels)
print('test_acc:', test_acc)

运行结果:

Epoch 1/5
60000/60000 [==============================] - 3s 58us/step - loss: 0.2564 - acc: 0.9261
Epoch 2/5
60000/60000 [==============================] - 2s 28us/step - loss: 0.1036 - acc: 0.9694
Epoch 3/5
60000/60000 [==============================] - 2s 27us/step - loss: 0.0682 - acc: 0.9795
Epoch 4/5
60000/60000 [==============================] - 2s 28us/step - loss: 0.0492 - acc: 0.9851
Epoch 5/5
60000/60000 [==============================] - 2s 29us/step - loss: 0.0375 - acc: 0.9888
10000/10000 [==============================] - 0s 44us/step
test_acc: 0.9786

使用卷积神经网络

首先加载mnist数据集,对数据进行预处理,由于使用卷积层,所以先将(28,28)的训练图片reshape为(28,28,1)的3D张量,而神经网络的输入取值较小,因此归一化为(0,1)之间的浮点型。对于标签,使用one-hot编码,与神经网络的输出对应。
Conv2D是卷积层,MaxPooling2D是池化层,Flatten()用于展平连接到全连接层。然后编译模型,训练与评估模型。
完整代码:

from keras.datasets import mnist
from keras import models
from keras.layers import Conv2D, MaxPooling2D, Flatten, Dense
from keras.utils import to_categorical

# 加载数据
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()

# 数据预处理
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)

# model
model = models.Sequential()
model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))
model.add(MaxPooling2D((2, 2)))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D((2, 2)))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(Flatten())
model.add(Dense(64, activation='relu'))
model.add(Dense(10, activation='softmax'))

# 编译模型
model.compile(optimizer='rmsprop',
              loss='categorical_crossentropy',
              metrics=['accuracy'])

# train
model.fit(train_images, train_labels, epochs=5, batch_size=64)

# evaluate
test_loss, test_acc = model.evaluate(test_images, test_labels)
print('test_acc:', test_acc)

运行结果:

Epoch 1/5
60000/60000 [==============================] - 4s 59us/step - loss: 0.2559 - acc: 0.9262
Epoch 2/5
60000/60000 [==============================] - 2s 29us/step - loss: 0.1048 - acc: 0.9692
Epoch 3/5
60000/60000 [==============================] - 2s 29us/step - loss: 0.0694 - acc: 0.9798
Epoch 4/5
60000/60000 [==============================] - 2s 29us/step - loss: 0.0511 - acc: 0.9846
Epoch 5/5
60000/60000 [==============================] - 2s 29us/step - loss: 0.0380 - acc: 0.9885
10000/10000 [==============================] - 0s 44us/step
test_acc: 0.9807
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 手写数字识别是深度学习在计算机视觉领域的一项经典任务,可以使用PyQt5和TensorFlow Keras框架来实现。这种任务可以通过卷积神经网络(CNN)来完成。 首先,需要下载一个手写数字图像数据集,例如MNIST数据集。然后,可以使用TensorFlow Keras框架来搭建一个简单的CNN模型,来对图像进行分类。这个CNN模型可以包含一些卷积层、池化层、扁平层和全连接层来实现手写数字图像的分类。 接下来,使用PyQt5编写一个简单的GUI界面,提供用户手动输入数字图像的功能。GUI界面可以提供一个画布来让用户手动在上面绘制数字,然后对这个数字图像进行预测和分类。 具实现时,可以结合PyQt5的信号和槽机制,将用户手动绘制的数字图像与CNN模型进行关联。当用户完成数字图像的绘制后,程序可以自动进行图像分类,并输出数字识别结果。 总之,PyQt5和TensorFlow Keras框架提供了一个完整的工具链,用于实现手写数字识别的任务。开发者可以使用这些工具和技术来实现更加复杂的图像识别和分析任务。 ### 回答2: 手写数字识别是深度学习中的一个常见问题,而PyQt5则是一个流行的Python图形界面开发框架,可以将模型的结果以可视化的方式展示给用户。因此,使用PyQt5和TensorFlow-Keras搭建一个手写数字识别的应用程序是很有实际应用价值的。下面简单介绍一下实现步骤。 首先,我们需要一个手写数字数据集,可以使用MNIST数据集。通过使用TensorFlow-Keras的API,我们可以快速地构建一个CNN模型,并在训练数据上进行训练。 接下来,我们需要使用PyQt5构建GUI界面,这里可以使用QWidget框架。我们需要构建一个画布,允许用户手写数字,然后将用户手写的图像输入到CNN模型中进行预测。 在这里,我们可以使用QPainter来绘图,它可以使用户绘制完整的数字。在预测数字时,我们需要对图像进行一些预处理,例如将其大小调整为网络需要的输入尺寸,并将其转换为灰度图像。 在模型训练完毕之后,我们可以将模型保存下来,然后在PyQt5应用程序中加载模型,并使用它进行手写数字识别。当用户在画布上完成手写数字绘制后,我们可以将其送入已经训练好的CNN模型,然后让程序显示识别结果。 通过这样的方式,我们可以使用PyQt5和TensorFlow-Keras开发手写数字识别应用程序,为用户提供更加便捷的数字识别方式。 ### 回答3: 手写数字识别是深度学习中的一个经典问题,利用人工神经网络或深度卷积神经网络可以达到很高的准确率。PyQt5是一个Python编写的GUI库,可以将深度学习算法应用到用户友好的界面中,同时TensorFlow-Keras是一个强大的深度学习框架,利用它可以快速搭建一个卷积神经网络。 首先,我们需要准备手写数字数据集,比如MNIST数据集。我们可以使用Keras自带的数据集接口进行加载。然后,通过PyQt5绘制一个界面,使得用户可以在界面上进行手写数字输入。手写数字数据可以通过鼠标或触控板进行输入,我们可以将手写数字截图并进行处理,可以使用 PIL 库或 OpenCV 进行图片处理,将图片大小调整为合适的大小。接着,我们需要将图片输入到卷积神经网络中进行预测。我们可以使用TensorFlow-Keras搭建一个卷积神经网络模型,并把刚刚处理好的图片输入到模型中,进行预测。最后,我们可以在界面上输出预测结果,告诉用户识别数字是什么。 总之,借助PyQt5和TensorFlow-Keras的强大功能,我们可以轻松地设计一个手写数字识别的应用程序。但是需要注意的是,要精度高的数字识别需要使用比较深的卷积神经网络模型,并花费更多的时间来训练和调优模型。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值