zoukankan      html  css  js  c++  java
  • 神经网络MPLClassifier分类

    代码:

     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算法在模型训练速度和预测准确率方面都能达到较好的效果,建议使用!

  • 相关阅读:
    stm32之PWM博客好文收藏
    CSDN怎么转载别人的博客
    STM32F103单片机学习—— 通用定时器
    STM32 通用定时器好文章收藏
    stm32基本定时器timer6的原理与使用
    freertos优秀博客收藏
    StretchBlt函数和BitBlt函数的用法
    对话框添加背景图片
    vc 使窗口置顶 在最前面
    CWnd::MoveWindow 详解
  • 原文地址:https://www.cnblogs.com/qiao101/p/10113908.html
Copyright © 2011-2022 走看看