tensorflow2.0+keras+CNN实现mnist(包含自己手写的数据)

该博客通过导入TensorFlow的Keras库,构建了一个卷积神经网络(CNN)模型,用于识别MNIST数据集的手写数字。首先加载并预处理数据,然后构建模型,包括卷积层、池化层和全连接层,并使用Adam优化器和交叉熵作为损失函数。模型经过训练后,对测试集进行评估,得出准确率。接着,使用自定义的手写数字图片数据集进行评估,展示模型的预测结果,并输出预测准确率。
摘要由CSDN通过智能技术生成
一、导入我们必要的包
import tensorflow.keras as keras
from keras.datasets import mnist
from keras.layers import Conv2D, MaxPooling2D
from keras.layers import Dense, Flatten
from keras.models import Sequential
二、加载我们的数据
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
三、对我们的数据进行一个处理
train_images = train_images.reshape(train_images.shape[0], 28, 28, 1)
test_images = test_images.reshape(test_images.shape[0], 28, 28, 1)
train_images = train_images / 255.0
test_images = test_images / 255.0
train_labels = keras.utils.to_categorical(train_labels, 10)
test_labels = keras.utils.to_categorical(test_labels, 10)
四、构建我们的模型
model = Sequential()  #创建一个Sequential模型
# 第一层卷积:6个卷积核, 大小:5*5, 激活函数:relu
model.add(Conv2D(6, kernel_size=(5, 5), activation='relu', input_shape=(28, 28, 1)))
# 第二层池化:最大池化
model.add(MaxPooling2D(pool_size=(2, 2)))
# 第三层卷积:16个卷积核, 大小: 5*5, 激活函数:relu
model.add(Conv2D(16, kernel_size=(5, 5), activation='relu'))
# 第四层池化:最大池化
model.add(MaxPooling2D(pool_size=(2, 2)))
# 进行扁平化
model.add(Flatten())
# 全连接层一:输出节点为120个
model.add(Dense(120, activation='relu'))
# 全连接层二:输出节点为84个
model.add(Dense(84, activation='relu'))
# 输出层:用softmax激活函数计算分类的概率
model.add(Dense(10, activation='softmax'))  # 最后是10个数字,10个分类
五、设置我们的优化器和定义损失函数
model.compile(optimizer=keras.optimizers.Adam(), loss=keras.metrics.categorical_crossentropy, metrics=['accuracy'])
六、训练我们的模型
model.fit(train_images, train_labels, batch_size=32, epochs=2, verbose=1)
七、对我们的测试集进行评估
loss, accuracy = model.evaluate(test_images, test_labels)
print('损失:', loss)
print('准确率:', accuracy)
八、导入我们自己手写的数据集

  这里我们直接用我们处理过的数据。
mnist数据

import cv2
import numpy as np
# 加载处理之后的数据
image = []  # 存放我们读取的数据
# 读取我们处理后的10张图片
for i in range(10):
	deal_image = cv2.imread('deal_datasets/' + str(i) + '.jpg') # 读入我们的数据
	deal_image = cv2.cvtColor(deal_image, cv2.COLOR_BGR2GRAY)  # 转化图像为单通道(灰度图)
	image.append(deal_image)
image = np.array(image)
image_labels = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
九、对我们自己的数据进行处理
image = image.reshape(image.shape[0], 28, 28, 1)
image = image / 255.0
image_labels = keras.utils.to_categorical(image_labels, 10)
十、看看我们自己的数据是否正确
import matplotlib.pyplot as plt
# 展示我们处理之后的图片
plt.figure(figsize=(10, 5))
for i in range(10):
	plt.subplot(2, 5, i+1)
	plt.xticks([])
	plt.yticks([])
	plt.grid(False)
	plt.imshow(image[i], cmap=plt.cm.binary)
	plt.xlabel(image_labels[i])
plt.show()

处理之后的图片

十一、评估我们的数据
test_loss, test_accuracy = model.evaluate(image, image_labels, verbose=1, steps=10)
print('手写数据的准确率为:', test_accuracy)
十二、将我们的测试结果可视化
predictions = model.predict(image) # 将我们的测试数据放入我们的模型预测
# 预测的结果可视化
plt.figure(figsize=(10, 5))
for i in range(10):
	plt.subplot(2, 5, i+1)
	plt.xticks([])
	plt.yticks([])
	plt.grid(False)
	plt.imshow(image[i], cmap=plt.cm.binary)
	plt.xlabel('predict value: ' + str(np.argmax(predictions[i])))
plt.show()

我们的结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值