基于Keras实现鸢尾花分类

神经网络原理与实现(以鸢尾花分类为例)

  • 环境准备
  • 实现步骤
    • 第一步:导入Keras模型库,创建模型对象
      • Keras构建神经网络的两种模型
      • 导入keras库
        • 用顺序模型的构建和使用神经网络的基本步骤
    • 第二步:通过堆叠若干网络层来构建神经网络
    • 第三步:对网络进行配置
    • 第四步:准备数据
      • 向量化
      • 标准化
      • 类别标签独热编码
    • 第五步:模型训练
    • 第六步:模型的性能评价和预测应用
      • 模型的性能评价
      • 模型的预测应用

环境准备

Keras是深度学习框架,支持使用Python语言定义和训练各种深度学习模型。高度模块化,支持快速开发。并且支持CPU、GPU无缝切换运行;需要运行在专业的深度学习引擎上,如Tensorflow、CNTK和Theano等。
在Anaconda创建虚拟环境:

conda create -n 环境名称 

激活虚拟环境:

conda activate 环境名称

关闭虚拟环境:

conda deactivate

安装Keras:

pip install keras
pip install tensorflow

实现步骤

第一步:导入Keras模型库,创建模型对象

Keras构建神经网络的两种模型

Sequential:顺序式模型或序贯模型,可以通过各层按顺序线性堆叠来构建网络;
Functional:函数式模型,在顺序式模型的基础上,允许多输出、共享层等结构

导入keras库

from keras.models import Sequential#导入keras库
model = Sequential()

用顺序模型的构建和使用神经网络的基本步骤

model.add #添加层
model.compile #模型编译(训练的BP模式设置)
model.evaluate #模型参数设置+训练
model.predict() #模型预测

第二步:通过堆叠若干网络层来构建神经网络

model.add(Dense(n,activation,input_shape))

Dense:全连接层,节点与下一层节点完全连接
n:本层节点数
activition:激活函数,sigmoid、relu、tanh、softmax等
input_shape:输入数据的维度,用元组表示如(6,8)表示6*8两维数据,首层必须说明

model.add(Dropput(rate))

Dropout:失活层。在本层添加随机失活比例。为防止过拟合,训练过程中断开一些输入神经元连接
rate:随机失活比例

#第二步:通过堆叠若干网络层来构建神经网络
from keras.layers import Dense,Dropout
model.add(Dense(16,activation='relu',input_shape=(4,))) #隐层1
model.add(Dense(16,activation='relu'))  #隐层2
model.add(Dropout(0.25))  #隐层2随机失活25%
model.add(Dense(3,activation='softmax'))#输出层

多分类输出层激活函数要选’softmax’,即返回一个由多个概率值组成的数组(总和为1),每个概率表示输出为某一类的概率

第三步:对网络进行配置

对网络进行配置,即定义损失函数、优化器、性能评估指标等,并根据这些参数对网络进行编译。编译后的模型就可以用于学习训练

model.compile(loss,optimizer,metrics)

loss:损失函数,如多分类用交叉熵损失函数’categorical_crossentropy’,回归用均方差损失函数mean_squared_error等
optimizer:优化器即参数学习算法,以梯度下降算法为基础的方法’SGD’(随机梯度下降)、‘Adam’、'RMSprop’等
metrics:监控指标列表,包含评估模型在训练和测试时的性能指标,分类一般只关心精度

model.compile(loss='categorical_crossentropy',optimizer='adam',metrics=["accuracy"])

第四步:准备数据

对数据进行预处理,符合网络要求的类型、形状和数据分布

import pandas as pd
from sklearn.model_selection import train_test_split
data = pd.read_csv('data\iris.txt',header=None)
data.columns=['sepal length','sepal width','petal length','petal width','class']
print(data.iloc[0:5,:]) #查看前五条数据

向量化

神经网络的所有输入和输出都必须是浮点数或整数张量(即多维数据)

#向量化
X=data.iloc[:,0:4].values.astype(float)#数据特征X取值与前4列(数据中无编号列)
  #类名转化为整数
data.loc[ data['class'] == 'Iris-setosa','class'] = 0
data.loc[ data['class'] == 'Iris-versicolor','class'] = 1
data.loc[ data['class'] == 'Iris-virginica','class'] = 2
#标签y取值于第四列
y=data.iloc[:,4].values.astype(int)

标准化

将数据根据自身一定比例进行处理,使之落入一个待定区间。因为取值范围差异大容易造成训练不收敛
基于Keras实现鸢尾花分类_第1张图片

类别标签独热编码

多分类使用损失函数categorical_crossentropy,标签必须为多类模式,即one-hot编码的向量,而不是单个数值。
One-hot独热码是一组数,其中只有一个值为1,其余都是0

第五步:模型训练

#训练模型
model.fit(train_x,train_y_ohe,epochs=50,batch_size=1,verbose=2,validation_data=(test_x,test_y_ohe))

x:输入数据。如果模型只有一个输入,那么x的类型是numpy array,如果模型有多个输入,那么x的类型是list,list的元素是对应各个输入的numpy array
y:标签 numpy array
batch_size:整数,指定进行梯度下降时每个batch包含的样本数,训练时一个batch样本会被计算一次梯度下降,更新依次权重,使得目标函数优化一步。
epochs:整数,训练迭代次数,当未设置initial_epoch时,即是训练的总轮数,否则总轮数为epochs-initial_epoch
verbose:日志显示,0为不在标准输出流输出日志信息,1为输出进度条记录,2为每个epoch输出一行记录
validation_data:形式为(X,y)tuple,是指定的验证集,此参数将覆盖validation_spilt

第六步:模型的性能评价和预测应用

模型的性能评价

loss,accuracy=model.evaluate(X_testm,Y_test,verbose)

loss:预测标签和目标标签之间的损失值
accuracy:精确率
X_test:测试集数据
Y_test:测试集标签
verbose:日志显示,0为不在标准输出流输出日志信息,1为输出进度条记录,3为每个epoch输出一行记录

#模型性能评价
	#评估模型
loss,accuracy = model.evaluate(test_x,test_y_ohe,verbose=2)
print('loss={},accuracy={}'.format(loss,accuracy))

模型的预测应用

model.predict(X_test,batch_size,verbose)

X_test:测试集数据
batch_size:整数,指定进行梯度下降时每个batch包含的样本数
verbose:日志显示,0为不在标准输出流输出日志信息,1为输出进度条记录,3为每个epoch输出一行记录

#查看预测结果,属于各类的概率
classes = model.predict(test_x,batch_size=1,verbose=2)
print('测试样本数:',len(classes))
print('分类概率:\n',classes)

基于Keras实现鸢尾花分类_第2张图片
基于Keras实现鸢尾花分类_第3张图片

你可能感兴趣的:(学习笔记,深度学习和神经网络,keras,分类,深度学习)