一、导入我们必要的包
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)
八、导入我们自己手写的数据集
这里我们直接用我们处理过的数据。
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()