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')#画出准确率执行结果

结果可以看出训练数据的准确率和验证数据的准确率

keras多层感知器对手写数字识别

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)

运行结果

keras多层感知器对手写数字识别

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)]

keras多层感知器对手写数字识别