本章重點介紹「多層感知器」,即MLP算法node
MLP也稱爲前饋神經網絡,泛稱爲神經網絡算法
原理網絡
神經網絡中的非線性矯正app
在生成隱藏層後,對 結果進行非線性矯正 rele 或進行雙曲正切處理 tanhdom
經過這兩種方式處理後的結果用來計算最終結果y函數
用圖像展現:工具
【結果分析】學習
這兩種非線性處理方式,都是爲了將樣本特徵簡化,從而使神經網絡能夠對複雜的非線性數據集進行學習測試
神經網絡的參數設置fetch
在酒的數據集上使用MLP算法中的MLP分類器:
#導入MLP神經網絡
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]
y = wine.target
#拆分數據集
X_train,X_test,y_train,y_test = train_test_split(X,y,random_state=0)
#定義分類器
mlp = MLPClassifier(solver='lbfgs') # l 是 L的小寫
mlp.fit(X_train,y_train)
各個參數的含義:
用圖像展現下MLP分類的狀況:
#導入畫圖工具
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,edgecolor='k',s=60)
plt.xlim(xx.min(),xx.max())
plt.ylim(yy.min(),yy.max())
plt.title('MLPClassifier:solver=1bfgs')
plt.show()
試試把隱藏層的節點變少:
#設計隱藏層中的結點數爲10
mlp_20 = MLPClassifier(solver='lbfgs',hidden_layer_sizes=[10])
mlp_20.fit(X_train,y_train)
Z1 = mlp_20.predict(np.c_[xx.ravel(),yy.ravel()])
Z1 = Z1.reshape(xx.shape)
plt.figure()
plt.pcolormesh(xx,yy,Z1,cmap=cmap_light)
#用散點圖畫出X
plt.scatter(X[:,0],X[:,1],c=y,edgecolor='k',s=60)
plt.xlim(xx.min(),xx.max())
plt.ylim(yy.min(),yy.max())
plt.title('MLPClassifier:nodes=10')
plt.show()
給MLP分類器增長隱藏層數量:
#設計神經網絡有兩個節點數爲10的隱藏層
mlp_2L = MLPClassifier(solver='lbfgs',hidden_layer_sizes=[10,10])
mlp_2L.fit(X_train,y_train)
Z0 = mlp_2L.predict(np.c_[xx.ravel(),yy.ravel()])
Z0 = Z0.reshape(xx.shape)
plt.figure()
plt.pcolormesh(xx,yy,Z0,cmap=cmap_light)
#用散點圖畫出X
plt.scatter(X[:,0],X[:,1],c=y,edgecolor='k',s=60)
plt.xlim(xx.min(),xx.max())
plt.ylim(yy.min(),yy.max())
plt.title('MLPClassifier:2Layers')
plt.show()
【結果分析】
隱藏層的增長的結果就是決定邊界看起來更細膩
使用activation='tanh'實驗:
#設計激活函數爲tanh
mlp_tanh = MLPClassifier(solver='lbfgs',hidden_layer_sizes=[10,10],activation='tanh')
mlp_tanh.fit(X_train,y_train)
Z2 = mlp_tanh.predict(np.c_[xx.ravel(),yy.ravel()])
Z2 = Z2.reshape(xx.shape)
plt.figure()
plt.pcolormesh(xx,yy,Z2,cmap=cmap_light)
#用散點圖畫出X
plt.scatter(X[:,0],X[:,1],c=y,edgecolor='k',s=60)
plt.xlim(xx.min(),xx.max())
plt.ylim(yy.min(),yy.max())
plt.title('MLPClassifier:2Layers with tanh')
plt.show()
#修改模型的alpha參數
mlp_alpha = MLPClassifier(solver='lbfgs',hidden_layer_sizes=[10,10],activation='tanh',alpha=1)
mlp_alpha.fit(X_train,y_train)
Z3 = mlp_alpha.predict(np.c_[xx.ravel(),yy.ravel()])
Z3 = Z3.reshape(xx.shape)
plt.figure()
plt.pcolormesh(xx,yy,Z3,cmap=cmap_light)
#用散點圖畫出X
plt.scatter(X[:,0],X[:,1],c=y,edgecolor='k',s=60)
plt.xlim(xx.min(),xx.max())
plt.ylim(yy.min(),yy.max())
plt.title('MLPClassifier:alpha=1')
plt.show()
實戰——手寫識別
使用現成的數據集 MNIST 訓練圖像識別
1.使用MNIST
#導入數據集獲取工具
from sklearn.datasets import fetch_mldata
#加載MNIST手寫數字數據集
mnist = fetch_mldata('MNIST original')
mnist
print('樣本數量:',mnist.data.shape[0])
print('樣本特徵數:',mnist.data.shape[1])
爲了控制神經網絡的時長,只選5000個樣本做爲訓練集,1000做爲測試集【爲了每次選取的數據保持一致,指定random_state=62】:
#創建訓練集和測試集
X = mnist.data / 255
y = mnist.target
X_train,X_test,y_train,y_test = train_test_split(X,y,train_size = 5000,test_size = 1000,random_state=62)
2.訓練MLP神經網絡
#設置神經網絡有兩個100個結點的隱藏層
mlp_hw = MLPClassifier(solver='lbfgs',hidden_layer_sizes=[100,100],activation='relu',alpha=1e-5,random_state=62)
#訓練神經網絡模型
mlp_hw.fit(X_train,y_train)
print('測試集得分:',mlp_hw.score(X_test,y_test)*100)
測試集得分: 93.60000000000001
3.識別
#導入數據處理工具
from PIL import Image
#打開圖像
image = Image.open('4.jpg').convert('F')
#調整圖像大小
image = image.resize((28,28))
arr=[]
#將圖像中的像素做爲預測數據點的特徵
for i in range(28):
for j in range(28):
pixel = 1.0-float(image.getpixel((j,i)))/255
arr.append(pixel)
#但因爲只有一個樣本,因此須要進行reshape操做
arr1 = np.array(arr).reshape(1,-1)
#進行圖像識別
print(mlp_hw.predict(arr1)[0])
2.0
使用的圖形是28*28像素:
MLP僅限於處理小數據集,對於更大或更復雜的數據集,能夠進軍深度學習
神經網絡優勢
神經網絡缺點