keras多层感知器对手写数字识别
Keras学习总结
keras是基于TensorFlow的深度学习框架,在编写keras代码时,我们不必去管keras的底层运行内容(矩阵运算),我们只需建立模型,处理好输入参数的数据类型就可以。我写的博客主要是类似于做笔记,写得不好,仅供参考。
keras多层感知器对手写数字识别的步骤
1、数据预处理(处理好输入的数据类型)
2、建立模型
3、训练模型(利用训练数据和验证数据对模型进行训练)
4、评估模型准确率(用测试数据对模型进行评估)
5、进行预测(预测测试数据的标签)
6、结果分析
在学习keras时发现理解keras 框架的原理并不难,主要的是keras内置函数的输入参数,以及输入参数的数据类型需要注意的, 下面通过解释代码来了解keras,红字部分需要记
1、数据预处理
import numpy as np
import pandas as pd
from keras.utils import np_utils
a=np.random.seed(10)
from keras.datasets import mnist
(X_train_image,y_train_label),(X_test_image,y_test_label)=mnist.load_data()#下载数据集
x_train=X_train_image.reshape(60000,784).astype('float32') #转换为1维向量
x_test=X_test_image.reshape(10000,784).astype('float32')
x_train_normalize=x_train/255#标准化
x_test_normalize=x_test/255
#把0~9的数字转换为10个1或0的组合
y_trainOneHot=np_utils.to_categorical(y_train_label)
y_testOneHot=np_utils.to_categorical(y_test_label)
调用包和下载数据集没什么好说的。因为下载完的数据类型是28*28维的数据,而输入层为1*784的数据,所以利用x_train=X_train_image.reshape(60000,784).astype('float32') 把多维数据转换为一维数据,把一维数据标准化,可以提高模型的准确率。数据的标签为0到9的数字,需要经过数独热编码转换为10个0或1的组合,正好对应输出层的10个神经元(有多少种标签就要有多少个输出神经元),y_trainOneHot=np_utils.to_categorical(y_train_label)。转换完的y_trainOneHot类型为float,n行10列。
2、模型建立
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Dropout
model=Sequential()#建立Sequential模型
model.add(Dense(units=256,
input_dim=784,
kernel_initializer='normal',
activation='relu')) #建立输入层,隐藏层
model.add(Dropout(0.5))#加入Dropout功能防止过拟合
model.add(Dense(units=10,
kernel_initializer='normal',
activation='softmax'))#建立输出层
model.summary()#查看模型摘要
主要要记住这些参数代表什么,输入层里:units为隐藏层神经元个数,input_dim为输入神经元的个数(输入神经元主要看数据有多少个属性),kernel_initializer为使用正态分布的随机数 来初始化weight权重和偏差,activation为**函数,一般输入层和隐藏层用relu,输出层用softmax,softmax适用于多分类。
3、模型训练
model.compile(loss='categorical_crossentropy',
optimizer='adam',metrics=['accuracy'])##定义训练方式
train_history=model.fit(x=x_train_normalize,
y=y_trainOneHot,validation_split=0.2,
epochs=10,batch_size=200,verbose=2)#训练模型
首先设置训练方式,loss为设置损失函数categorical_crossentropy(交叉熵)的训练效果比较好,一般使用这个(损失函数就是帮我我们计算真实值和预测值之间的误差)。optimizer为设置优化器,使用使用adam优化器可以让模型更快收敛(优化器的作用为在不断的批次训练中不断更新权重和偏差,是损失函数最小化)。metrics为设置评估模型的方式为准确率。开始训练的参数里面输入训练数据,训练标签,划分0.2为验证集,epochs为训练周期,batch_size为每一训练批次要输入多少个数据(训练批次=总数据/一批次训练的数据量)verbose为显示训练过程。
接下来写一个显示训练过程的可视化函数
#建立显示训练过程的函数
import matplotlib.pyplot as plt
def show_train_history(train_history,train,validation):
plt.plot(train_history.history[train])
plt.plot(train_history.history[validation])
plt.title('Train History')
plt.ylabel(train)
plt.xlabel('Epoch')
plt.legend(['train','validation'],loc='upper left')
plt.show()
show_train_history(train_history,'acc','val_acc')#画出准确率执行结果
结果可以看出训练数据的准确率和验证数据的准确率
4评估模型准确率
scores=model.evaluate(x_test_normalize,y_testOneHot)#评估测试集
print('准确率为:',scores[1])
输入测试数据和测试标签
5、进行预测
prediction=model.predict_classes(x_test)#预测测试集
输入测试数据,标准化前后都行
编写一个方便查看数字图像、真实的数字与预测结果的函数
def plot_images_labels_prediction(images,labels,prediction,idx,num=10):
fig=plt.gcf()#设置显示图形大小
fig.set_size_inches(12,14)
if num>25:num=25
for i in range(0,num):
ax=plt.subplot(5,5,1+i)#建立子图5行5列
ax.imshow(images[idx],cmap='binary')
title='lablel='+str(labels[idx])
if len(prediction)>0:
title+=',predict='+str(prediction[idx])
ax.set_title(title,fontsize=10)
ax.set_xticks([]);ax.set_yticks([])
idx+=1
plt.show()
plot_images_labels_prediction(X_test_image,y_test_label,prediction,idx=340)
运行结果
6、结果分析
pd.crosstab(y_test_label,prediction,
rownames=['label'],colnames=['predict'])#混淆矩阵
df=pd.DataFrame({'label':y_test_label,'predict':prediction})#找出真实值是‘5’,预测为‘3’
df[(df.label==5)&(df.predict==3)]