反馈神经网络

2020-06-14  本文已影响0人  还闹不闹

1、Reference

多层感知机MLP(机器学习5)
多层感知机原理详解 & Python与R实现
深度学习笔记——TensorFlow学习笔记(三)使用TensorFlow实现的神经网络进行MNIST手写体数字识别

2、训练数据

链接:https://pan.baidu.com/s/1-huymiLHqmjzfor8CroevQ
提取码:uu3i

3、参数解释

使用sklearn.neural_network中的MLPClassifier()来实现MLP,其主要参数如下:

hidden_layer_size:tuple型输入,形如(m,n),其中m用来控制隐层神经元的个数,n用来控制隐层的层数,也可以理解为网络总层数-2(即减去输入层与输出层),默认值为(100,),即单隐层,隐层中含有100个神经元
activation:字符型,用于控制激活函数的类型,可选类型有'identity',表示无非线性激活函数,用于训练线性模型时;'logistic',logit函数;'tanh',双曲函数;'relu',f(x)=max(0,x)
solver:字符型,用来控制BP算法中使用到的求解器,'lbfgs',表示准牛顿法;'sgd',表示标准的随机梯度下降法;'adam',另一种类型的基于随机梯度下降的方法。默认为'adam'
alpha:惩罚项系数,默认为0.0001
batch_size:当solver设置为随机梯度相关的求解器时,此参数控制随机优化器的小批量尺寸
learning_rate:字符型,控制学习率,当设置为'constant'时,训练过程中的学习率为另一参数learning_rate_init预设的常数;当设置为'invscaling',会逐步的降低学习率以减小在最优值附近震荡的风险;当设置为'adaptive'时,且early_stopping被设置为开启时,如果连续两次训练集上的累积误差没有下降或交叉验证得分无法得到提升时,学习率会变为原来的1/5,只有当solver设置为'sgd'时才生效
learning_rate_init:双精度浮点值,控制初始的学习率,配合learning_rate的设置值,共同控制学习率的变化情况,只有当solver设置为'sgd'或'adam'时才生效(即基于梯度)
max_iter:整型,控制训练的最大迭代轮数,默认值是200轮,当然,该方法也是只有solver设置为'sgd'或'adam'时才会生效
shuffle:bool型,控制是否在每一轮迭代中打乱样本的顺序,默认值是True,只有solver设置为'sgd'或'adam'时才会生效
random_state:整型,控制随机数种子,即控制训练开始时随时初始化权重的过程,默认不设置
tol:设定精度的阈值,默认是1e-4,设置的越小,理论上训练精度越高,同时迭代次数也相应越多
verbose:bool型,控制是否打印整个训练过程的细节
warm_start:bool型,控制是否进行预训练,即通过预训练得到一个较好的初始权重,再进行正式训练,默认为False
momentum:float型,设置梯度下降中的动量因子,默认为0.9,只有当solver设置为'sgd'时才会生效
early_stopping:bool型,是否在验证分数不再得到提高且未达到设置的最大迭代轮数之前”早停“训练,默认为False,只有solver设置为'sgd'或'adam'时才会生效
validation_fraction:float型,控制验证集的比例,默认为0.1,且只有在early_stopping设置为True时才会生效

函数的返回项:

classes_:数组或列表形式,显示每一个输出对应的类别标签
loss_:float型,输出当前达到的最小累积误差水平
coefs_:列表,返回训练好的网络中的权重矩阵
n_iter_:整型,返回求解器迭代的总次数
n_layers_:整型,返回当前网络层数
n_outputs_:整型,返回当前网络输出个数
out_activation_:字符型,输出当前网络中的激活函数

4、分类

#!/usr/bin/python
# coding=utf-8
import numpy as np
import pandas as pd
from sklearn.neural_network import MLPClassifier
from sklearn import datasets
from sklearn.metrics import confusion_matrix
from sklearn.metrics import accuracy_score

# 显示所有列
pd.set_option('display.max_columns', None)
# 显示所有行
pd.set_option('display.max_rows', None)
# 设置value的显示长度为10000,默认为50
pd.set_option('display.width',10000)
pd.set_option('display.unicode.ambiguous_as_wide', True)
pd.set_option('display.unicode.east_asian_width', True)
#
np.set_printoptions(linewidth=1000)

'''加载数据集'''
X,y = datasets.load_breast_cancer(return_X_y=True)
print(y[0])

'''初始化多层感知机分类器,其中激活函数选择logit函数,求解器选择adam版随机梯度下降法,最小精度设置为1e-5,并设置早停处理,验证集比例为0.3'''
clf = MLPClassifier(activation='logistic', solver='adam', max_iter=1000, tol=1e-5, validation_fraction=0.3, hidden_layer_sizes=(50,1))

'''利用训练集训练网络'''
clf = clf.fit(X,y)

'''打印验证集上的混淆矩阵'''
print(confusion_matrix(y,clf.predict(X)))

'''打印验证集上的正确率'''
print(accuracy_score(y,clf.predict(X)))

'''显示网络中的训练目标标签'''
print('训练目标标签',clf.classes_)

'''打印输入层与隐层之间所有连接上的权重矩阵的形状,即共30 * 100个权重'''
print('输入层与隐层之间所有连接上的权重矩阵形状:',clf.coefs_[0].shape)

'''打印隐层与输出层之间的权重矩阵形状,即100 * 1个权重'''
print('隐层与输出层之间的权重矩阵形状:',clf.coefs_[1].shape)

'''打印隐层上所有神经元内部的阈值向量的形状'''
print('隐层上所有神经元内部的阈值向量的形状:',clf.intercepts_[0].shape)

'''打印输出层神经元(本例中为单个输出)内部的阈值'''
print('输出层神经元(本例中为单个输出)内部的阈值:',clf.intercepts_[1])

'''打印总训练轮数'''
print('总训练轮数',clf.n_iter_)

5、回归

#!/usr/bin/python
# coding=utf-8
from sklearn.neural_network import MLPRegressor
import matplotlib.pyplot as plt
import numpy as np
import math

'''生成仿真一维数据集'''
X = np.arange(-5,5,0.05).reshape((-1,1))

'''因变量计算函数,添加了随即误差项'''
def My_f(x):
    y = x**2-x**3+x+math.exp(x)+np.random.randn()
    return y

'''根据公式生成因变量仿真值'''
y = np.array([My_f(X[i]) for i in range(len(X))]).reshape((-1,1))

plt.figure(figsize=(14,9))
iter = 1000
for i in range(1,10):
    plt.subplot(330+i)
    plt.scatter(X,y,s=5)
    rg = MLPRegressor(activation='relu',max_iter=iter)
    rg = rg.fit(X,y)
    y_pre = rg.predict(X)
    plt.plot(X,y_pre,c='red')
    plt.title('iterations:'+str(iter))
    # plt.show()
    iter += 1000
plt.show()

X = np.arange(-9,9,0.05).reshape((-1,1))

y = np.array([My_f(X[i]) for i in range(len(X))]).reshape((-1,1))

# --------------------------------------------------------------
y_pre = rg.predict(X)
plt.scatter(X,y,s=3)
plt.plot(X,y_pre,c='red')
# plt.show()
随着迭代次数的增多,拟合曲线(红线)越来越逼近与真实情况 过拟合
上一篇下一篇

猜你喜欢

热点阅读