1.神经网络基础
上面这个图是动物神经的解刨图,由于神经仅有兴奋与抑制两种状态,这与计算机仅有“0”“1”两种状态相吻合,这也就是神经网络可以应用于计算机的原因。神经网络的发展历史如下:
- 1943年,美国神经解剖学家沃伦麦克洛奇(Warren McCulloch)与神经网络和数学家沃尔特皮茨(Walter Pitts)提出脑神经元的抽象模型,即M-P (McCulloch-Pitts neuron,MCP)。
- 1958 年,计算机科学家弗兰克罗森布拉特(Frank Rossenblatt)提出第一个感知机学习法则。
- 1969 年,计算机领域的专业人士马文明斯基(Marvin Minsky),出版了preceptron的一书,提出了感知机的弱点,使得神经网络会输陷于低谷
- 1979年,杰弗瑞·欣顿(GeofferyHinton)提出了反向传播算法(Backpropagation,BP),因此杰弗瑞·欣顿被称为神经网络之父。
- 后来出现了多层感知器(Multilayer Preceptron,MLP)
- 现在的深度学习,都属于神经网络的范畴。
人工智能,机器学习,深度学习之间的关系如下图所示。
动物的神经网络活动过程如下:
- 外部刺激通过神经末梢转为电信号,传到神经元细胞;
- 无数神经元构成神经中枢;
- 神经中枢综合各种信号做出判断;
- 把神经中枢的指令发送到人体各个部分,对外部刺激做出反应。
神经网络原理公式:
= wk1⋅x1+ wk2⋅x2 + ⋯ + wkn⋅xn + bk
如下图所示:
[xk1,xk2,…xkn]为输入,求和以后加上偏置值bk,最后通过激活函数𝝋(⋅)达到预测值。不考虑偏置值bk和激活函数𝝋(⋅),我们可以以下图左边进行简单表示:
在MLP模型多层感知器中,我们会在输入与输出之间加入1-n个隐藏层重复上面进行加权求和计算,如上图右边所示。隐藏层的层数叫做神经网络的深度,下面这张图为深度为2的神经网络。
输出:
- y = h21+h22+h23
神经网络包括输入层、隐藏层和输出层。输入层为一组输入参数(x1,x2,…,xm),隐藏层包括值(wk1,wk2…,wkm),偏置值bk,激活函数𝝋(⋅)和加法器𝛴。
为了让模型比普通话线性模型更为强大,我们需要对结果进行非线性校正(即激活函数𝝋(⋅)),非线性校正包括下面4类:
- identity :对样本不做处理,f(x)=x
- logistic (回归分析) : f(x)=1/[1+exp(−x)]
- tanh (双曲正切处理):tangent hyperbolic)
- relu (非线性矫正):rectified linear unit) 默认
我们在这里仅介绍relu和tanh。
import numpy as np import matplotlib.pyplot as plt def Nerver_base(): line = np.linspace(-5,5,200) #np.tanh()返回具有三角正切正弦的数组 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把值域控制在(-1,1)之间; relu将<0的部分强制=0,保留>0的部分。
2. Sklearn关于MLP分类器的参数
在sklearn 中使用MLP分类器函数为:from sklearn.neural_network import MLPClassifier。这个函数里面有几个参数非常重要,分别是:solver、hidden_layer_sizes、activation、level和alpha。
- solver:包括'lbfgs','sgd','adam',默认为'adam'。权重优化的求解器:
- 'lbfgs'是准牛顿方法族的优化器;
- 'sgd'指的是随机梯度下降;
- 'adam'是指由Kingma,Diederik和Jimmy Ba提出的基于随机梯度的优化器。
注意:默认解算器“adam”在相对较大的数据集(包含数千个训练样本或更多)方面在训练时间和验证分数方面都能很好地工作。但是,对于小型数据集,“lbfgs”可以更快地收敛并且表现更好。
- hidden_layer_sizes:[100,100],表示有两个隐藏层,第一个为100个元素,第二个为100个元素。
- activation:包括'identity','logistic','tanh','relu',默认'relu' 隐藏层的激活函数。
- 'identity',无操作激活,对实现线性瓶颈很有用,返回f(x)= x;
- 'logistic',logistic sigmoid函数,返回f(x)= 1 /(1+ exp(-x));
- 'tanh',双曲tan函数,返回f(x)= tanh(x);
- alpha:float,可选,默认为0.0001。L2惩罚(正则化项)参数。
观察以下代码。
from sklearn.neural_network import MLPClassifier from sklearn.model_selection import train_test_split from sklearn import datasets from matplotlib.colors import ListedColormap def sklearn_for_Nerver(solver,hidden_layer_sizes,activation,level,alpha): wine = datasets.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=solver,hidden_layer_sizes=hidden_layer_sizes,activation=activation,alpha=alpha,max_iter=10000) mlp.fit(X_train,y_train) #使用不同色块 cmap_light = ListedColormap(['#FFAAAA','#AAFFAA','#AAAAFF']) cmap_bold = ListedColormap(['#FF0000','#00FF00','#0000FF']) #分别将样本的两个特征值创建图像的横轴和纵轴 x_min,x_max = X_train[:,0].min()-1,X_train[:,0].max()+1 y_min,y_max = X_train[:,1].min()-1,X_train[:,1].max()+1 xx, yy = np.meshgrid(np.arange(x_min, x_max, .02),np.arange(y_min, y_max, .02)) #给每个样本分配不同的颜色, predict:训练后返回预测结果,显示标签值 Z = mlp.predict(np.c_[xx.ravel(),yy.ravel()]) Z = Z.reshape(xx.shape) plt.figure() # plt.pcolormesh的作用在于能够直观表现出分类边界 plt.pcolormesh(xx,yy,Z,cmap=cmap_light,shading='auto') #用散点把样本表示出来 plt.scatter(X[:,0],X[:,1],c=y,cmap=cmap_bold,s=60,edgecolors='k') plt.xlim(xx.min(),xx.max()) plt.ylim(yy.min(),yy.max()) plt.title("MLPClassifier:solver:"+solver+",node:"+str(hidden_layer_sizes)+",activation:"+activation+",level="+str(level)+",alpha="+str(alpha)) print("红酒数据训练集:MLPClassifier:solver:"+solver+",node:"+str(hidden_layer_sizes)+",activation:"+activation+",level="+str(level)+",alpha="+str(alpha)+":{:.2%}".format(mlp.score(X_train,y_train))) print("红酒数据测试集:MLPClassifier:solver:"+solver+",node:"+str(hidden_layer_sizes)+",activation:"+activation+",level="+str(level)+",alpha="+str(alpha)+":{:.2%}".format(mlp.score(X_test,y_test))) plt.show()
我们通过下面的函数来调用上面的sklearn_for_Nerver函数。
分别得到以下5张图。
(1)solver:lbfgs,node:[100],activation:relu,level=1,alpha=0.0001
(2)solver:lbfgs,node:[10],activation:relu,level=1,alpha=0.0001
这张图由于node数量减少,颜色区域边界比第1章毛刺多。
(3)solver:lbfgs,node:[10,10],activation:relu,level=2,alpha=0.0001
由于(3)增加了隐藏层,边界更加细腻。
(4)solver:lbfgs,node:[10,10],activation:than,level=2,alpha=0.0001
activation变为than后,边界变得更加平滑。
(5)solver:lbfgs,node:[10,10],activation:than,level=2,alpha=1
通过加大alpha增加模型的正则化程度。
注解:模型越复杂,消耗资源大,但容易过拟合;反之模型简单,消耗资源小,速度快,但容易欠拟合。
3.示例:手写数字识别
MNIST 数据集来自美国国家标准与技术研究所, NationalInstitute of Standards and Technology (NIST). 训练集 (training set) 由来自 250 个不同人手写的数字构成, 其中 50% 是高中学生, 50% 来自人口普查局 (the Census Bureau) 的工作人员. 测试集(test set) 也是同样比例的手写数字数据。
在以前的版本中获取MNIST 数据的python函数为:mnist = fetch_mldata('MNISTOraginal'), sklearn 2.0版本以后变成了minist = datasets.fetch_openml('mnist_784')。第一次执行这个程序,会把MNIST 数据集从网上下载到你本地C:\Users\<用户名>\scikit_learn_data\openml目录下,时间比较长,需要你的耐心等待,以后就不用等待那么长时间了。
from PIL import Image def writeing(): minist =datasets.fetch_openml('mnist_784') print("样本数量{},样本特征数:{}".format(minist.data.shape[0],minist.data.shape[1])) X = minist.data/255 y = minist.target X_train,X_test,y_train,y_test= train_test_split(X, y, random_state=62) mlp =MLPClassifier(solver='lbfgs',hidden_layer_sizes=[100,100],activation='tanh',alpha=1e-5,random_state=62) mlp.fit(X_train,y_train) print("测试集得分:{:.2%}".format(mlp.score(X_test,y_test))) image=Image.open('3.jpg').convert('F') # 调整图像的大小 image=image.resize((28,28)) arr=[] # 将图像中的像素作为预测数据点的特征 for i in range(28): for j inrange(28): pixel=1.0-float(image.getpixel((j,i)))/255 arr.append(pixel) # 由于只有一个样本,所以需要进行reshape操作 arr1=np.array(arr).reshape(1,-1)# reshape成一行, 无论多少列 # 进行图像识别 plt.imshow(image) plt.show() print('图片中的数字是:{}'.format(mlp.predict(arr1)[0]))
输出:
样本数量70000,样本特征数:784
测试集得分:95.16%
图片中的数字是:4
sklearn 处理提供MLPClassifier分类方法,还提供方法MLPRegressor回归方法。
注意:在上面程序中,有些同学为了提高速度,采用MINST中的部分数据作为训练集和测试集,即X_train,X_test,y_train,y_test= train_test_split(X, y, random_state=62)改为X_train,X_test,y_train,y_test = train_test_split(X, y, train_size=5000,test_size=1000,random_state=62),效果不是很好,使用全数据训练虽然速度相对慢,但是正确性高。
图片支持jpg和png各种格式。
4.神经网络分类
神经网络可以分为:全连接神经网络、卷积神经网络和循环神经网络。
- 全连接神经网络:适合入侵检测、股票检测;
- 卷积神经网络:适合图像识别;
循环神经网络:适合对象识别、机器翻译。
—————————————————————————————————
软件安全测试
https://study.163.com/course/courseMain.htm?courseId=1209779852&share=2&shareId=480000002205486
接口自动化测试
https://study.163.com/course/courseMain.htm?courseId=1209794815&share=2&shareId=480000002205486
DevOps 和Jenkins之DevOps
https://study.163.com/course/courseMain.htm?courseId=1209817844&share=2&shareId=480000002205486
DevOps与Jenkins 2.0之Jenkins
https://study.163.com/course/courseMain.htm?courseId=1209819843&share=2&shareId=480000002205486
Selenium自动化测试
https://study.163.com/course/courseMain.htm?courseId=1209835807&share=2&shareId=480000002205486
性能测试第1季:性能测试基础知识
https://study.163.com/course/courseMain.htm?courseId=1209852815&share=2&shareId=480000002205486
性能测试第2季:LoadRunner12使用
https://study.163.com/course/courseMain.htm?courseId=1209980013&share=2&shareId=480000002205486
性能测试第3季:JMeter工具使用
https://study.163.com/course/courseMain.htm?courseId=1209903814&share=2&shareId=480000002205486
性能测试第4季:监控与调优
https://study.163.com/course/courseMain.htm?courseId=1209959801&share=2&shareId=480000002205486
Django入门
https://study.163.com/course/courseMain.htm?courseId=1210020806&share=2&shareId=480000002205486
啄木鸟顾老师漫谈软件测试
https://study.163.com/course/courseMain.htm?courseId=1209958326&share=2&shareId=480000002205486