目录
一、定义和公式
1. 多层感知器 Multi Layer Perceptron MLP
2. MLP实现非线性分类
3. Keras介绍
二、 代码实战
1. 建立MLP模型实现二分类
1.1 进行数据分离:test_size=0.33,random_state=10
1.2 模型结构:一层隐藏层,有20个神经元
2. 建立MLP模型实现图像多分类
2.1 载入数据集,可视化图形数字
2.2 数据预处理,图像数据维度转换,归一化,输出结果格式转换
2.3 建立MLP模型,2层隐藏层,每层392个神经元,计算模型在预测数据的准确率
由于当逻辑回归模型中的属性过多,会导致多项式的数据量很大,解决这个问题可以使用MLP,也叫人工神经网络ANN,该模型结构模仿人的思考机制。
神经元结构的数值化(类似逻辑回归模型框架):
在MLP应用中,可以把激活函数替换为relu、tanh、softmax等
多层感知器MLP模型框架(多个逻辑回归模型叠加在一起):
数学表达式为:
逻辑回归模型与神经网络模型之间的关系:
- 逻辑回归不适用于图像分类,因为图像分类通常是非线性分类,需要生成大量多项式数据,逻辑回归模型求解慢,预测效果不好,但是针对特征容易识别的图像,要求尽可能用简单的模型来实现分类,可以尝试使用逻辑回归。
- 神经网络是把很多歌逻辑回归单元连接在一起组合成一个网络结构
- 在MLP应用中,可以把激活函数替换为relu、tanh、softmax等
通过3个简单逻辑回归模型可以得到一个非线性的复杂MLP模型,用于实现二分类,输出y为0或1
有3个逻辑回归模型如下:
- 与门:y: x1 AND x2
- 与非门:y: (NOT x1) AND (NOT x2)
- 或门:y: x1 OR x2
将1,2,3组合在一起实现同或门:y: x1 XNOR x2 (相同为1,不同为0)
- 前两层分别增加一个值为1的元素,即x0和a0
- 前两个模型作为输入层组成第一层,计算出a1^2和a2^2
- 第二层到第三层用第三个模型,作为输出层,计算出y函数关系式
- 分别将x1和x2代入y函数关系式中,计算出y值
MLP实现多分类预测:
- 判断输入数据属于输出数据y1,y2,y3,y4哪个类别,计算各种结果的概率,选取概率最大的为其预测结果
- 一个隐藏层有2(n+1)个神经元
- 需要对输出结果y进行预处理,将数值转换为One-Hot向量
MLP模型实现图像多分类任务
算法流程:
- 加载图片并将其转换为数字矩阵
- 对输入数据进行维度转换与归一化处理
- 对输出结果进行格式转化
- 建立MLP模型结构
- MLP模型训练参数配置
- 模型训练与预测
Keras:是用python编写的,以TensorFlow或Theano作为后台,用于神经网络开发的应用接口。集成了深度学习中各类成熟的算法,比调用TF更简单
TensorFlow:用数据流图,用于数值计算的开源软件库,可自动计算模型相关的微分导数,适合用于神经网络模型的求解,用Keras可以将TF封装成一个接口,易于调用
# 1. load the data
import pandas as pd
import numpy as np
data = pd.read_csv('data.csv')
data.head()
# 2. define the X and y
X = data.drop(['y'],axis=1)
y = data.loc[:,'y']
X.head()
# 3. 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()
fig1:
'''
任务1:进行数据分离:test_size=0.33,random_state=10
'''
# 4. 分离数据 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)
print(X_train.shape,X_test.shape,X.shape)
'''
建立模型结构:一层隐藏层,有20个神经元
'''
# 5. 建立模型,通过add方法叠加各层网络 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')) # 第一层,units代表第一层的输出层有多少个神经元,input_dim代表输入层有多少个神经元
mlp.add(Dense(units=1,activation='sigmoid'))
mlp.summary()
# 6. 配置模型求解过程参数 compile the model
mlp.compile(optimizer='adam',loss='binary_crossentropy')
# 7. 训练模型 train the model
mlp.fit(X_train,y_train,epochs=3000) # epochs迭代次数
# 8. 在训练数据集上预测模型,并计算准确率 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)
# 9. 在测试数据集上预测模型,并计算准确率 make prediction 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)
# 10. 生成网格点坐标矩阵 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) # predict输出的是概率,predict_classes可以将概率转化成数组
print(type(y_range_predict))
# 11. 把预测结果从数组转换为可用于索引的series类型 format the output
y_range_predict_form = pd.Series(i[0] for i in y_range_predict)
print(y_range_predict_form)
# 12. 可视化
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('prediction result')
plt.show()
fig2:
mnist数据集介绍:
60000个训练样本,10000个测试样本,每个样本是一张28*28像素的灰度手写数字图片
# 1. load the mnist data
from keras.datasets import mnist
(X_train,y_train),(X_test,y_test) = mnist.load_data()
print(type(X_train),X_train.shape)
# 2. visualize the data
img1 = X_train[0]
%matplotlib inline
from matplotlib import pyplot as plt
fig1 = plt.figure(figsize=(3,3))
plt.imshow(img1)
plt.title('image size: 28 X 28')
plt.show()
# 3. 输出该图片的数组矩阵
img1
fig1:
'''
数据预处理,图像数据维度转换,归一化,输出结果格式转换
'''
# 4. 转换输入数据维度,将28*28像素转换为1行784列 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)
print(X_train_format.shape) # 由(60000, 28, 28) 转换为 (60000, 784)
# 5. 标准化输入数据,每个数据/255灰度值 normalize the input data
X_train_normal = X_train_format/255
X_test_normal = X_test_format/255
print(X_train_normal[0])
# 6. 转换输出格式为onehot 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)
print(y_train_format[0])
# 7. 打印数据维度
print(X_train_normal.shape,y_train_format.shape) # (60000, 784) (60000, 10)
'''
建立MLP模型,计算模型在预测数据的准确率
模型结构为2层隐藏层,每层392个神经元
'''
# 8. set up the model
from keras.models import Sequential
from keras.layers import Dense, Activation
mlp = Sequential()
mlp.add(Dense(units=392,activation='relu',input_dim=784)) # 输入层(784)+隐藏层1(392)
mlp.add(Dense(units=392,activation='relu')) # 隐藏层2(392)
mlp.add(Dense(units=10,activation='softmax')) # 输出层(10: 0,1,2...9)
mlp.summary()
# 9. 配置训练参数 configure the model
mlp.compile(loss='categorical_crossentropy',optimizer='adam',metrics=['categorical_accuracy'])
# 10. 模型训练 train the model
mlp.fit(X_train_normal,y_train_format,epochs=10)
# 11. 模型预测 evaluate the model
y_train_predict = mlp.predict_classes(X_train_normal)
print(type(y_train_predict))
print(y_train_predict[0:10])
# 12. 训练数据的准确率
from sklearn.metrics import accuracy_score
accuracy_train = accuracy_score(y_train,y_train_predict)
print(accuracy_train) # 0.99
# 13. 测试数据的准确率
y_test_predict = mlp.predict_classes(X_test_normal)
accuracy_test = accuracy_score(y_test,y_test_predict)
print(accuracy_test) # 0.98
# 14. 输入新的图片
img2 = X_test[100]
fig2 = plt.figure(figsize=(3,3))
plt.imshow(img2)
plt.title(y_test_predict[100])
plt.show()
# 15. 输出所有图片及其对应的预测数字
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)]
fig3 = 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([])
fig2:
fig3: