keras—多层感知器MLP—MNIST手写数字识别

  一、手写数字识别

现在就来说说如何使用神经网络实现手写数字识别。 在这里我使用mind manager工具绘制了要实现手写数字识别需要的模块以及模块的功能: 
keras—多层感知器MLP—MNIST手写数字识别

其中隐含层节点数量(即神经细胞数量)计算的公式(这只是经验公式,不一定是最佳值):

m=n+l−−−−√+am=n+l+a 
m=log2nm=log2⁡n 
m=nl−−√m=nl 
  • m: 隐含层节点数
  • n: 输入层节点数
  • l:输出层节点数
  • a:1-10之间的常数

本例子当中:

  • 输入层节点n:784
  • 输出层节点:10 (表示数字 0 ~ 9)
  • 隐含层选30个,训练速度虽然快,但是准确率却只有91% 左右,如果将这个数字变为100 或是300,其训练速度回慢一些

    ,但准确率可以提高到93%~94% 左右。

    因为这是使用的MNIST的手写数字训练数据,所以它的图像的分辨率是28 * 28,也就是有784个像素点,其下载地址为:http://yann.lecun.com/exdb/mnist/

    二、查看数据程序

  • 48000作为训练数据,12000作为验证数据,10000作为预测数据
  •  #coding=utf-
    import numpy as np #导入模块,numpy是扩展链接库
    import pandas as pd #类似一个本地的excel,偏向现在的非结构化的数据库
    import tensorflow as tf
    import keras
    from keras.utils import np_utils
    np.random.seed() #设置seed可以产生的随机数据
    from keras.datasets import mnist #导入模块,下载读取mnist数据
    (x_train_image,y_train_label),\
    (x_test_image,y_test_label)=mnist.load_data() #下载读取mnist数据
    print('train data=',len(x_train_image))
    print('test data=',len(x_test_image))
    print('x_train_image:',x_train_image.shape)
    print('y_train_label:',y_train_label.shape) #查看数据
    import matplotlib.pyplot as plt
    def plot_image(image): #定义显示函数
    fig=plt.gcf()
    fig.set_size_inches(,) #设置显示图形的大小
    plt.imshow(image,cmap='binary') #黑白灰度显示
    plt.show() #开始画图
    y_train_label[] #查看第0项label数据
    import matplotlib.pyplot as plt
    def plot_image_labels_prediction(image,lables,prediction,idx,num=):#显示多项数据
    fig=plt.gcf()
    fig.set_size_inches(,) #设置显示图形的大小
    if num>:num=
    for i in range(,num): #画出num个数字图形
    ax=plt.subplot(,,i+) #建立subplot字图形为5行5列
    ax.imshow(image[idx],cmap='binary') #画出subgraph
    title="lable="+str(lables[idx]) #设置字图形title,显示标签字段
    if len(prediction)>: #如果传入了预测结果
    title+=",predict="+str(prediction[idx]) #标题
    ax.set_title(title,fontsize=) #设置字图形的标题
    ax.set_xticks([]);ax.set_yticks([]) #设置不显示刻度
    idx+= #读取下一项
    plt.show()
    plot_image_labels_prediction(x_train_image,y_train_label,[],,)#查看训练数据前10项
    plot_image_labels_prediction(x_test_image,y_test_label,[],,) #查看测试数据前10项

    三、运行结果

  • keras—多层感知器MLP—MNIST手写数字识别
  • 四、训练预测识别程序

  •  #coding=utf-8
    #1.数据预处理
    import numpy as np #导入模块,numpy是扩展链接库
    import pandas as pd
    import tensorflow
    import keras
    from keras.utils import np_utils
    np.random.seed(10) #设置seed可以产生的随机数据
    from keras.datasets import mnist #导入模块,下载读取mnist数据
    (x_train_image,y_train_label),\
    (x_test_image,y_test_label)=mnist.load_data() #下载读取mnist数据
    print('train data=',len(x_train_image))
    print('test data=',len(x_test_image))
    print('x_train_image:',x_train_image.shape)
    print('y_train_label:',y_train_label.shape)
    import matplotlib.pyplot as plt
    def plot_image(image):
    fig=plt.gcf()
    fig.set_size_inches(2,2)
    plt.imshow(image,cmap='binary')
    plt.show()
    y_train_label[0]
    import matplotlib.pyplot as plt
    def plot_image_labels_prediction(image,lables,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,i+1)
    ax.imshow(image[idx],cmap='binary')
    title="lable="+str(lables[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_image_labels_prediction(x_train_image,y_train_label,[],0,10)
    plot_image_labels_prediction(x_test_image,y_test_label,[],0,10)
    x_Train=x_train_image.reshape(60000,784).astype('float32') #以reshape转化成784个float
    x_Test=x_test_image.reshape(10000,784).astype('float32')
    x_Train_normalize=x_Train/255 #将features标准化
    x_Test_normalize=x_Test/255
    y_Train_OneHot=np_utils.to_categorical(y_train_label)#将训练数据和测试数据的label进行one-hot encoding转化
    y_Test_OneHot=np_utils.to_categorical(y_test_label)
    #2.建立模型
    from keras.models import Sequential #可以通过Sequential模型传递一个layer的list来构造该模型,序惯模型是多个网络层的线性堆叠
    from keras.layers import Dense #全连接层
    model=Sequential()
    #建立输入层、隐藏层
    model.add(Dense(units=256,
    input_dim=784,
    kernel_initializer='normal',
    activation='relu'))
    #建立输出层
    model.add(Dense(units=10,
    kernel_initializer='normal',
    activation='softmax'))
    print(model.summary())
    #3、进行训练
    #对训练模型进行设置,损失函数、优化器、权值
    model.compile(loss='categorical_crossentropy',
    optimizer='adam',metrics=['accuracy'])
    # 设置训练与验证数据比例,80%训练,20%测试,执行10个训练周期,每一个周期200个数据,显示训练过程2次
    train_history=model.fit(x=x_Train_normalize,
    y=y_Train_OneHot,validation_split=0.2,
    epochs=10,batch_size=200,verbose=2)
    #显示训练过程
    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') #画出准确率评估结果
    show_train_history(train_history,'loss','val_loss') #画出误差执行结果
    #以测试数据评估模型准确率
    scores=model.evaluate(x_Test_normalize,y_Test_OneHot) #创建变量存储评估后的准确率数据,(特征值,真实值)
    print()
    print('accuracy',scores[1])
    #进行预测
    prediction=model.predict_classes(x_Test)
    prediction
    plot_image_labels_prediction(x_test_image,y_test_label,prediction,idx=340)
  • 五、运行结果

  • keras—多层感知器MLP—MNIST手写数字识别

    keras—多层感知器MLP—MNIST手写数字识别

  • keras—多层感知器MLP—MNIST手写数字识别

    keras—多层感知器MLP—MNIST手写数字识别

  • 评估模型准确率结果为:0.9754
  • keras—多层感知器MLP—MNIST手写数字识别

  • 预测结果:有一个潦草的5预测错误为3
  • keras—多层感知器MLP—MNIST手写数字识别
上一篇:有标号DAG计数 [容斥原理 子集反演 组合数学 fft]


下一篇:SpringMVC自动封装List对象 —— 自定义参数解析器