网站建设如何测试重庆快速排名优化
人工智能学习概述—快手视频
人工智能学习32-Keras手写体识别—快手视频
人工智能学习32-Keras手写体识别—快手视频
人工智能学习32-Keras手写体识别—快手视频
人工智能学习32-Keras手写体识别—快手视频
人工智能学习32-Keras手写体识别—快手视频
#从keras.layers 导入 2维卷积层,全连接层,最大池化层,拉平层,漏失层,最大平均池
化层
from keras.layers import Conv2D, Dense, MaxPooling2D, Flatten, Dropout,
GlobalAveragePooling2D
#从keras.datasets 引入 mnist 数据集,已经标注过的数据集
from keras.datasets import mnist
#引入keras顺序模型Sequential
from keras import Sequential
import keras
#引入numpy类库,方便矩阵操作
import numpy as np
#引入图形类库,方便图形显示
import matplotlib.pyplot as plt
#引入os操作系统类库,操作本地文件和目录
import os
#避免多库依赖警告信息
os.environ['KMP_DUPLICATE_LIB_OK'] = 'True'
#设置神经网络模型存储目录,当前python源文件所在目录上一级下的saved_models目录
save_dir = '../saved_models'
#如果目录saved_models不存在,新建此目录
if not os.path.isdir(save_dir):
os.makedirs(save_dir)
#神经网络模块名称
model_name = 'numpred_keras_trained_model.h5'
#设置神经网络分类数量,0-9个数字需要10个分类
num_classes = 10
#小批量训练时设置每次训练样品批量
batch_size = 128
#网络训练次数,一次前向传递和一次反馈成为一个epoch
epochs = 10
#手写体图片高和宽,像素数
img_rows, img_cols = 28, 28
#输入手写体图片维度数,高*宽*通道数=28*28*1,灰度图通道数为1,彩色图(RGB)通道数
为3
input_shape = (img_rows, img_cols, 1)
#从数据集mnist装入训练数据集和测试数据集,mnist提供load_data方法
(x_train, y_train), (x_test, y_test) = mnist.load_data()
#灰度图编码范围0-255,将编码归一化,转化为0-1之间数值
x_train = x_train.astype('float32') / 255.0
x_test = x_test.astype('float32') / 255.0
#将训练数据集和测试数据集转化为张量(batch,height,width,channel)
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)
#将训练和测试标注数据转化为张量(batch,num_classes)
y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)
#定义Keras顺序模型Sequential
model = Sequential()
#添加二维卷积层,通道为32,核函数3*3,激活函数Relu,输入张量(28,28,1)
model.add(Conv2D(filters=32,
kernel_size=(3,
input_shape=input_shape))
#添加二维卷积层,通道为64,核函数3*3,激活函数Relu
3),
activation='relu',
model.add(Conv2D(filters=64, kernel_size=(3, 3), activation='relu'))
#添加最大池化,核大小(2*2)
model.add(MaxPooling2D(pool_size=(2, 2)))
#添加Dropout漏失层,漏失比例20%
model.add(Dropout(rate=0.2))
#添加拉平层,将张量拉平为一维向量
model.add(Flatten())
#添加Dropout漏失层,漏失比例50%
model.add(Dropout(rate=0.5))
#添加全连接层,输出尺寸128维向量,激活函数为Relu
model.add(Dense(units=128, activation='relu'))
#添加输出层,输出尺寸10维向量,激活函数为Softmax,将输入图片映射为0-9个数字
model.add(Dense(num_classes, activation='softmax'))
#编译模型,损失函数采用交叉熵,优化器采用Adadelta,获取统计数据为准确率
model.compile(loss=keras.losses.categorical_crossentropy,
optimizer=keras.optimizers.Adadelta(), metrics=['acc'])
#显示网络层次结构
model.summary()
#训练模型
#x_train 为训练数据集,y_train为训练数据集标注结果
#batch_size 为小批量训练每次训练样品数,epochs为训练次数
#verbose=1 为输出训练过程信息
# validation_data=(x_test,y_test)是测试数据集,目录为衡量模型预测准确率
model.fit(x_train, y_train,
batch_size=batch_size,
epochs=epochs,
verbose=1,
validation_data=(x_test, y_test)
)
#神经网络模型保持目录
model_path = os.path.join(save_dir, model_name)
#保存训练后的神经网络模型
model.save(model_path)
print('Model save at file %s' % model_path)
#测试神经网络模型预测效果
n = 10 #取出测试数据集中前10个样本
#使用训练好的模型预测结果
pred = model.predict(x_test[:n], n)
#定义图形界面分为3行10列显示图片
plt.figure(figsize=(10, 3))
#循环显示每幅图片,标注真实值,和网络预测值
for i in range(n):
#定义图片输出位置
plt.subplot(1, 10, i+1)
plt.subplots_adjust(wspace=2)
#格式化图片格式
t = x_test[i].reshape(28, 28)
#显示图片
plt.imshow(t, cmap='gray')
if pred[i].argmax() == y_test[i].argmax():
#预测正确时,使用绿色显示真实值和预测值
plt.title('%d,%d'
%
color='green')
else:
(pred[i].argmax(),
#预测错误时,使用红色显示真实值和预测值
y_test[i].argmax()),
plt.title('%d,%d' % (pred[i].argmax(), y_test[i].argmax()), color='red')
plt.xticks([])
plt.yticks([])
#显示图片窗口
plt.show()
自定义手写体网络模型