神经网络原理与实现(以鸢尾花分类为例)
环境准备
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)
标准化
将数据根据自身一定比例进行处理,使之落入一个待定区间。因为取值范围差异大容易造成训练不收敛
类别标签独热编码
多分类使用损失函数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)