機器學習【七】神經網絡

本章重點介紹「多層感知器」,即MLP算法node

MLP也稱爲前饋神經網絡,泛稱爲神經網絡算法

原理網絡

 

 神經網絡中的非線性矯正app

在生成隱藏層後,對  結果進行非線性矯正 rele 或進行雙曲正切處理 tanhdom

經過這兩種方式處理後的結果用來計算最終結果y函數

 

用圖像展現:工具

import numpy as np
#導入畫圖工具
import matplotlib.pyplot as plt
#生成一個等差數列
line = np.linspace(-5,5,200)
#畫出非線性矯正的圖形表示
plt.plot(line,np.tanh(line),label='tanh')
plt.plot(line,np.maximum(line,0),label='relu')
#設置圖注位置
plt.legend(loc='best')
plt.xlabel('x')
plt.ylabel('relu(x) and tanh(x)')
plt.show()

 

【結果分析】學習

  • tanh函數把特徵x的值壓縮進-1到1的區間,-1表明x中較小的值,1表明較大的值
  • relu函數把小於0的x值所有去掉,用0代替

這兩種非線性處理方式,都是爲了將樣本特徵簡化,從而使神經網絡能夠對複雜的非線性數據集進行學習測試

 

 

神經網絡的參數設置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僅限於處理小數據集,對於更大或更復雜的數據集,能夠進軍深度學習

 

神經網絡優勢

  • 計算能力充足且參數設置合適狀況下,神經網絡表現特優異
  • 對於特徵類型單一的數據,變現不錯

神經網絡缺點

  •  訓練時間長、對數據預處理要求高
  •  數據特徵類型差別較大,隨機森林或梯度上升隨機決策樹算法更好

 

相關文章
相關標籤/搜索