1. 程式人生 > >神經網絡MPLClassifier分類

神經網絡MPLClassifier分類

牛頓法 classes val .gz not in 合並 ati solver mnist

代碼:

 1 # -*- coding: utf-8 -*-
 2 """
 3 Created on Fri Aug 24 14:38:56 2018
 4 
 5 @author: zhen
 6 """
 7 import gzip
 8 import pickle
 9 import numpy as np
10 from sklearn.neural_network import MLPClassifier
11  # 加載數據
12  # 設置編碼,解決異常:UnicodeDecodeError: ‘ascii‘ codec can‘t decode byte 0x90 in position 614: ordinal not in range(128)
13 with gzip.open("E:/mnist.pkl.gz") as fp: 14 training_data, valid_data, test_data = pickle.load(fp, encoding=bytes) 15 x_training_data, y_training_data = training_data 16 x_valid_data, y_valid_data = valid_data 17 x_test_data, y_test_data = test_data 18 classes = np.unique(y_test_data) 19 # 將驗證集和訓練集合並
20 x_training_data_final = np.vstack((x_training_data, x_valid_data)) 21 y_training_data_final = np.append(y_training_data, y_valid_data) 22 # 設置神經網絡模型參數 23 # 使用solver=‘lbfgs‘,擬牛頓法,需要較多的跌點次數 24 lbfgs = MLPClassifier(solver=lbfgs, activation=relu, alpha=1e-4, hidden_layer_sizes=(50, 50), random_state=1, max_iter=10, verbose=10, learning_rate_init=0.1)
25 # 使用solver=‘adam‘,基於隨機梯度下降的優化算法,準確率較低 26 adam = MLPClassifier(solver=adam, activation=relu, alpha=1e-4, hidden_layer_sizes=(50, 50), random_state=1, max_iter=10, verbose=10, learning_rate_init=0.1) 27 # 使用solver=‘sgd‘,基於梯度下降的自適應優化算法,分批訓練數據,效率高,準確性高,建議使用 28 sgd = MLPClassifier(solver=sgd, activation=relu, alpha=1e-4, hidden_layer_sizes=(50, 50), random_state=1, max_iter=10, verbose=10, learning_rate_init=0.1) 29 # 使用不同算法訓練模型 30 lbfgs.fit(x_training_data_final, y_training_data_final) 31 adam.fit(x_training_data_final, y_training_data_final) 32 sgd.fit(x_training_data_final, y_training_data_final) 33 # 預測 34 lbfgs_predict = lbfgs.predict(x_test_data) 35 adam_predict = adam.predict(x_test_data) 36 sgd_predict = sgd.predict(x_test_data) 37 print(lbfgs_predict) 38 print("*******************************************") 39 print(adam_predict) 40 print("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@") 41 print(sgd_predict) 42 print("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!") 43 # 評估模型 44 print(lbfgs.score(x_test_data, y_test_data)) 45 print("===========================================") 46 print(adam.score(x_test_data, y_test_data)) 47 print("-------------------------------------------") 48 print(sgd.score(x_test_data, y_test_data)) 49 50 # 輸出正確結果 51 print(y_test_data)

結果:

技術分享圖片

  max_iter=10

技術分享圖片

  max_iter=20

技術分享圖片

  註意:  

  1. 當使用pickle加載mnist數據時,python3.x與python2.x差距較大,python3.x會拋出異常,異常信息為:UnicodeDecodeError: ‘ascii‘ codec can‘t decode byte 0x90 in position 614: ordinal not in range(128)

    此時需要指定編碼pickle.load(fp, encoding=‘bytes‘)來解決異常!

  2. 比較lbfgs(擬牛頓法)、adam(基於隨機梯度下降的優化算法)和sgd(基於梯度下降的自適應優化算法)可知,lbfgs波動較大,在相同訓練數據的情況下,當叠代次數不同時,模型預測準確率波動較大。adam算法模型訓練較快,但模型預測準確率較差,適合應用在預測準確率要求不高,響應時間短的地方。sgd算法在模型訓練速度和預測準確率方面都能達到較好的效果,建議使用!

神經網絡MPLClassifier分類