深度学习之多层感知器(代码可直接运行)

多层感知器(MLP)

问题引入:

(1)根据检测数据x1、x2及其标签,判断x1=0.7、x2=0.6时所属类别
在这里插入图片描述
如果采用逻辑回归,因为边界函数并不是单一的直线或圆之类的函数,所以这个逻辑回归边界函数不很好找到,如果初始数据属性有100项甚至更多项,那么形成的多项式数据量会非常庞大。
(2)根据各个国家100项指标,判断其未来5年的发展潜力
在这里插入图片描述
这样的数据有多个指标,那么其二次多项式个数就会更加多。
(3)自动识别图片中的动物是猫还是狗。
在这里插入图片描述
计算机对于图片看到的是一个二维数组的数值,其中有图像RGB值,灰度值,像素值三种。具体关系见链接图像RGB值灰度值像素值三者关系
在这里插入图片描述
上图就为计算机所看到的图片值
计算机的解决办法:
随机选取固定的两个点P1,P2,基于其灰度值进行分类预测。
在这里插入图片描述
红色点是小猫,蓝色点是小狗,由此可以进行逻辑回归进行分类。
对于输入的数据矩阵如下
在这里插入图片描述
在这里插入图片描述
可以看出,输入的数据量非常巨大,再加上模型的二次项,就超过了百亿,非常耗时耗空间
由此产生多层感知器(Multi-Layer Percepron)

多层感知器的介绍

多层感知机(MLP,Multilayer Perceptron)也叫人工神经网络(ANN,Artificial Neural Network),之所以叫做人工神经网络,原因如下:
可以尝试建立一个模型,其结构模仿人的思考机制
上图为神经元结构,按照此结构进行简化成为我们想要的模型结构
上图为神经元结构,按照此结构进行简化成为我们想要的模型结构
在这里插入图片描述
在这里插入图片描述
上图为逻辑回归模型的框架,由此可以看出两种模型的框架结构非常像。
根据这种模型框架我们做出了如下的多层感知器模型框架
在这里插入图片描述
其中a1 a2 …an等等隐含神经元都是通过输入神经元x1 x2 …xn直接的关系得出的,以此同样的方法影响后面的隐含神经元,最后再影响输出神经元。
y=g(z)=1/(1+exp(-z))
a21=g(θ110 x0+θ111 x1+θ112 x2+…)
a22=g(θ210 x0+θ211 x1+θ212 x2+…)

在这里插入图片描述
隐藏层:
多层感知机在单层神经网络的基础上引入了一到多个隐藏层(hidden layer)。隐藏层位于输入层和输出层质检。上图展示了一个多层感知机的神经网络,它含有一个隐藏层,该层中有5个隐藏单元。
输入和输出个数为别为4和3,中间隐藏层中包含了5个隐藏单元。由于输入层不涉及计算,多层感知机的层数为2。隐藏层中的神经元和输入层各输入完全连接,输出层中的神经元和隐藏层中的各神经元也完全连接。因此多层感知机中的隐藏层和输出层都是全连接。
激活函数:
使用隐藏变量使用按照元素运算的非线性函数进行变换,然后作为一个全连接层的输入。这个非线性函数进行转换叫作激活函数(activation function)
这里只介绍一下sigmoid函数
sigmoid函数可以将元素的值转变到0和1之间
sigmoid(x)=g(x)=1/(1+exp(-x))
在这里插入图片描述

MLP用于非线性分类预测

要求:在不增加高次项数据的情况下,如何通过MLP实现非线性分类预测
在这里插入图片描述
建立一个逻辑回归模型
在这里插入图片描述
通过这三个逻辑回归模型组合在一起形成多层感知器
在这里插入图片描述
多分类:
将数据分为两种以上的类别
将下列图片分成小猫、小狗和小马三类
在这里插入图片描述
在这里插入图片描述
最后的结果1 0 0就代表是小猫,0 1 0就代表的是小狗 ,0 0 1就代表的是小马。

Keras介绍

Keras是一个用Python编写的用于神经网络开发的应用接口,调用开接口可以实现神经网络、卷积神经网络、循环神经网络等常用深度学习算法的开发
特点:
集成了深度学习中各类成熟的算法,容易安装和使用,样例丰富,教程和文档也非常详细;
能够以TensorFlow,或者Theano作为后端运行。
Keras or Tensorflow
Tensorflow是一个采用数据流图,用于数值计算的开源软件库,可自动计算模型相关的微分导数:非常适合用于神经网络模型的求解。
Keras可看作为tensorflow封装后的一个接口(Keras作为前端,TensorFlow作为后端。
Keras为用户提供了一个易于交互的外壳)方便进行深度学习的快速开发。

实战部分

任务一:
基于data.csv数据,建立mlp模型,计算其在测试数据上的准确率,可视化模型预测结果:
1.进行数据分离:test_size=0.33,random_state=10
2.模型结构:一层隐藏层,有20个神经元
数据链接

#loada the data
import pandas as pd
import numpy as np
data = pd.read_csv('data.csv')
#visualize the data
%matplotlib inline
from matplotlib import pyplot as plt
fig1 = plt.figure(figsize=(5,5))
passed=plt.scatter(X.loc[:,'x1'][y==1],X.loc[:,'x2'][y==1])
failed=plt.scatter(X.loc[:,'x1'][y==0],X.loc[:,'x2'][y==0])
plt.legend((passed,failed),('passed','failed'))
plt.xlabel('x1')
plt.ylabel('x2')
plt.title('raw data')
plt.show()

在这里插入图片描述

#split the data
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.33,random_state=10)
#产生33%的测试案例
print(X_train.shape,X_test.shape,X.shape)
#set up the model
from keras.models import Sequential
from keras.layers import Dense, Activation
mlp = Sequential()
mlp.add(Dense(units=20, input_dim=2, activation='sigmoid'))
mlp.add(Dense(units=1,activation='sigmoid'))
mlp.summary()#看一下模型的结构

Using TensorFlow backend. Model: “sequential_1” _________________________________________________________________
Layer (type) Output Shape Param #

dense_1 (Dense) (None, 20) 60


dense_2 (Dense) (None, 1) 21

Total params: 81 Trainable params: 81 Non-trainable params: 0 _________________________________________________________________

#complie the model 
mlp.compile(optimizer='adam',loss='binary_crossentropy')#stdl二维是binary_crossentropy
#train the model 
mlp.fit(X_train,y_train,epochs=10000)#模拟测试越多模拟程度越好,这里选择了模拟10000次,那么模拟程度就非常高但是运行时间会很长
#make prediction and calculate the accuracy 
y_train_predict = mlp.predict_classes(X_train)
from sklearn.metrics import accuracy_score
accuracy_train= accuracy_score(y_train,y_train_predict)
print(accuracy_train)#0.9963636363636363
#make predict based on the test data
y_test_predict = mlp.predict_classes(X_test)
accuracy_test= accuracy_score(y_test,y_test_predict)
print(accuracy_test)#1.0
#由此便发现模拟程度非常高
#generate new data for plot
xx,yy=np.meshgrid(np.arange(0,1,0.01),np.arange(0,1,0.01))
x_range=np.c_[xx.ravel(),yy.ravel()]
y_range_predict = mlp.predict_classes(x_range)
#format the output
y_range_predict_form=pd.Series(i[0] for i in y_range_predict)
fig2=plt.figure(figsize=(5,5))
passed_predict = plt.scatter(x_range[:,0][y_range_predict_form==1],x_range[:,1][y_range_predict_form==1])
failed_predict = plt.scatter(x_range[:,0][y_range_predict_form==0],x_range[:,1][y_range_predict_form==0])
passed = plt.scatter(X.loc[:,'x1'][y==1],X.loc[:,'x2'][y==1])
failed = plt.scatter(X.loc[:,'x1'][y==0],X.loc[:,'x2'][y==0])
plt.legend((passed,failed,passed_predict,failed_predict),('passed','failed','passed_predict','failed_predict'))
plt.xlabel('x1')
plt.ylabel('x2')
plt.title('raw data')
plt.show()

在这里插入图片描述
**结论:**通过mlp模型实现的非线性二分类,产生的模拟程度非常高,训练程度达到99.64%的程度,测试程度达到100%的程度。
任务二:
基于mnist数据集,建立mlp模型,实现0-9数字的十分类task::
1.实现mnist数据载入,可视化图形数字
2.完成数据预处理:图像数据维度转换与归一化、输出结果格式转换
3.计算模型在预测数据集的准确率
4.模型结构:两层隐藏层,每层有392个神经元

#load the mnist data 
from keras.datasets import mnist
(X_train,y_train),(X_test,y_test)=mnist.load_data()
#visualize the data
img1=X_train[0]
from matplotlib import pyplot as plt 
fig1=plt.figure(figsize=(3,3))
plt.imshow(img1)
plt.title(y_train[0])
plt.show()

在这里插入图片描述

#format the input data
feature_size=img1.shape[0]*img1.shape[1]
X_train_format = X_train.reshape(X_train.shape[0],feature_size)
X_test_format = X_test.reshape(X_test.shape[0],feature_size)
#normalize the input data
X_train_normal = X_train_format/255
X_test_normal = X_test_format/255
print(X_train_normal[0])
#format the output data(labels)
from keras.utils import to_categorical 
y_train_format = to_categorical(y_train)
y_test_format = to_categorical(y_test)
#set up the model
from keras.models import Sequential
from keras.layers import Dense,Activation
mlp=Sequential()
mlp.add(Dense(units=392,activation='sigmoid',input_dim=feature_size))
mlp.add(Dense(units=392,activation='sigmoid'))
mlp.add(Dense(units=10,activation='softmax'))
mlp.summary()

Model: “sequential” _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= dense (Dense) (None, 392) 307720 _________________________________________________________________ dense_1 (Dense) (None, 392) 154056 _________________________________________________________________ dense_2 (Dense) (None, 10) 3930 ================================================================= Total params: 465,706 Trainable params: 465,706 Non-trainable params: 0 _________________________________________________________________

#configure the model 
mlp.compile(loss='categorical_crossentropy',optimizer='adam')
#categorical_crossentropy多分类函数
#train the model 
mlp.fit(X_train_normal,y_train_format,epochs=10)#训练10次
y_train_predict=mlp.predict_classes(X_train_normal)
from sklearn.metrics import accuracy_score
accuracy_train= accuracy_score(y_train,y_train_predict)
print(accuracy_train)

0.99785
训练还是非常高准确率

y_test_predict=mlp.predict_classes(X_test_normal)
accuracy_test= accuracy_score(y_test,y_test_predict)
print(accuracy_test)

0.9801
测试的准确率也非常高
接下来对数据进行随机展示,这里随机选择了第111个

img2=X_test[110]
fig12=plt.figure(figsize=(3,3))
plt.imshow(img2)
plt.title(y_test[110])
plt.show()

在这里插入图片描述

import matplotlib as mlp
font2 = {'family' : 'SimHei',
'weight' : 'normal',
'size'   : 20,
}
mlp.rcParams['font.family'] = 'SimHei'
mlp.rcParams['axes.unicode_minus'] = False
a = [i for i in range(1,10)]
fig4 = plt.figure(figsize=(5,5))
for i in a:
    plt.subplot(3,3,i)
    plt.tight_layout()
    plt.imshow(X_test[i])
    plt.title('predict:{}'.format(y_test_predict[i]),font2)
    plt.xticks([])
    plt.yticks([])

在这里插入图片描述

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值