天天看點

python--MLP神經網絡實作手寫數字識别

  • 概述

神經網路顧名思義将生物的神經系統中的興奮與抑制比作計算機中的0和1

知識點:

  1. 神經網絡原理
  2. 神經網絡中的非線性矯正
  3. 神經網絡參數設定
  • 參數設定

重要參數:

activation:隐藏單元進行非線性化的方法,一共4總:identity,logistic,tanh,relu

alpha:正則化參數,預設為0.0001,參數越大算法越簡單

hidden_layer_size:設定隐藏層的結點和層數:[10,10]表示2層,每層結點為10       

  • 圖像分析

import numpy as np
from sklearn.neural_network import MLPClassifier
from sklearn.datasets import load_wine

from sklearn.model_selection import train_test_split
wine = load_wine()
X = wine.data[:,:2]#隻取前2個屬性
y = wine.target
X_train,X_test,y_train,y_test = train_test_split(X,y,random_state=0)

mlp = MLPClassifier(solver = 'lbfgs',hidden_layer_sizes=[100,100],activation='tanh',alpha=1)
mlp.fit(X_train,y_train)

import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap

cmap_light = ListedColormap(['#FFAAAA','#AAFFAA','#AAAAFF'])
cmap_bold = ListedColormap(['#FF0000','#00FF00','#0000FF'])
                            
x_min, x_max = X[:,0].min() -1,X[:,0].max()+1
y_min, y_max = X[:,1].min() -1,X[:,1].max()+1
xx,yy = np.meshgrid(np.arange(x_min,x_max,.02),np.arange(y_min,y_max,.02))
z = mlp.predict(np.c_[xx.ravel(),yy.ravel()])
z = z.reshape(xx.shape)

plt.figure()
plt.pcolormesh(xx,yy,z,cmap=cmap_light)

plt.scatter(X[:,0],X[:,1],c=y,cmap=cmap_bold,edgecolor='k',s=20)
plt.xlim(xx.min(),xx.max())
plt.ylim(yy.min(),yy.max())

plt.show()

print("訓練得分:{:.2f}".format(mlp.score(X_train,y_train)))
print("測試得分:{:.2f}".format(mlp.score(X_test,y_test)))
           

通過内置紅酒資料集可畫出神經網絡算法圖:

python--MLP神經網絡實作手寫數字識别

将正則化參數恢複為預設後:

mlp = MLPClassifier(solver = 'lbfgs',hidden_layer_sizes=[100,100],activation='tanh')

python--MLP神經網絡實作手寫數字識别

可見參數對效果的影響。

  • 執行個體--手寫識别

使用内置資料集“load_digits

檢視參數:

print(digits.keys())#資料集中的建
print(digits.data[0])#第一個資料
print(digits.target[0])#第一個資料的類型
print(digits.DESCR)#描述
           
dict_keys(['data', 'target', 'target_names', 'images', 'DESCR'])
[ 0.  0.  5. 13.  9.  1.  0.  0.  0.  0. 13. 15. 10. 15.  5.  0.  0.  3.
 15.  2.  0. 11.  8.  0.  0.  4. 12.  0.  0.  8.  8.  0.  0.  5.  8.  0.
  0.  9.  8.  0.  0.  4. 11.  0.  1. 12.  7.  0.  0.  2. 14.  5. 10. 12.
  0.  0.  0.  0.  6. 13. 10.  0.  0.  0.]
0
.. _digits_dataset:

Optical recognition of handwritten digits dataset
--------------------------------------------------

**Data Set Characteristics:**

    :Number of Instances: 5620
    :Number of Attributes: 64
    :Attribute Information: 8x8 image of integer pixels in the range 0..16.
    :Missing Attribute Values: None
    :Creator: E. Alpaydin (alpaydin '@' boun.edu.tr)
    :Date: July; 1998

This is a copy of the test set of the UCI ML hand-written digits datasets
https://archive.ics.uci.edu/ml/datasets/Optical+Recognition+of+Handwritten+Digits

The data set contains images of hand-written digits: 10 classes where
each class refers to a digit.

Preprocessing programs made available by NIST were used to extract
normalized bitmaps of handwritten digits from a preprinted form. From a
total of 43 people, 30 contributed to the training set and different 13
to the test set. 32x32 bitmaps are divided into nonoverlapping blocks of
4x4 and the number of on pixels are counted in each block. This generates
an input matrix of 8x8 where each element is an integer in the range
0..16. This reduces dimensionality and gives invariance to small
distortions.

For info on NIST preprocessing routines, see M. D. Garris, J. L. Blue, G.
T. Candela, D. L. Dimmick, J. Geist, P. J. Grother, S. A. Janet, and C.
L. Wilson, NIST Form-Based Handprint Recognition System, NISTIR 5469,
1994.

.. topic:: References

  - C. Kaynak (1995) Methods of Combining Multiple Classifiers and Their
    Applications to Handwritten Digit Recognition, MSc Thesis, Institute of
    Graduate Studies in Science and Engineering, Bogazici University.
  - E. Alpaydin, C. Kaynak (1998) Cascading Classifiers, Kybernetika.
  - Ken Tang and Ponnuthurai N. Suganthan and Xi Yao and A. Kai Qin.
    Linear dimensionalityreduction using relevance weighted LDA. School of
    Electrical and Electronic Engineering Nanyang Technological University.
    2005.
  - Claudio Gentile. A New Approximate Maximal Margin Classification
    Algorithm. NIPS. 2000.
           

通過描述幸喜可以發現圖檔為8*8的大小

完整代碼:

#MNIST資料集
from sklearn.datasets import load_digits
digits = load_digits()
X=digits.data
y=digits.target
X_train,X_test,y_train,y_test = train_test_split(X,y,random_state=0)

mlp = MLPClassifier(solver = 'lbfgs',hidden_layer_sizes=[100,100],activation='relu',random_state=62)
mlp.fit(X_train,y_train)

print(X_train.shape,y_train.shape,X_test.shape,y_test.shape)
print("訓練得分:{:.2f}".format(mlp.score(X_train,y_train)))
print("測試得分:{:.2f}".format(mlp.score(X_test,y_test)))
#導入圖像處理工具
from PIL import Image

image = Image.open('1.png').convert('F')
image = image.resize((8,8))
arr = []

for i in range(8):
    for j in range(8):
        pixel = 1.0 - float(image.getpixel((j,i)))/255
        arr.append(pixel)
        
arr1 = np.array(arr).reshape(1,-1)

for i in range(10):
    print('{}的機率為:{}'.format(i,mlp.predict_proba(arr1)[0][i]))
print('結果為:{}'.format(mlp.predict(arr1)[0]))