BP神经网络实验
实验算法BP神经网络实验
【实验名称】
BP神经网络实验
【实验要求】
掌握BP神经网络模型应用过程,根据模型要求进行数据预处理,建模,评价与应用;
【背景描述】
神经网络:是一种应用类似于大脑神经突触联接的结构进行信息处理的数学模型。BP神经网络是一种按照误差逆向传播算法训练的多层前馈神经网络,是目前应用最广泛的神经网络。其基本组成单元是感知器神经元。
【知识准备】
了解BP神经网络模型的使用场景,数据标准。掌握Python/TensorFlow数据处理一般方法。了解keras神经网络模型搭建,训练以及应用方法
【实验设备】
Windows或Linux操作系统的计算机。部署TensorFlow,Python。本实验提供centos6.8环境。
【实验说明】
采用UCI机器学习库中的wine数据集作为算法数据,把数据集随机划分为训练集和测试集,分别对模型进行训练和测试。
【实验环境】
Pyrhon3.X,实验在命令行python中进行,或者把代码写在py脚本,由于本次为实验,以学
习模型为主,所以在命令行中逐步执行代码,以便更加清晰地了解整个建模流程。
【实验步骤】
第一步:启动python:
命令行中键入python。
第二步:导入用到的包,并读取数据:
(1).导入所需第三方包
import pandas as pd
import numpy as np
from keras.models import Sequential
from https://www.360docs.net/doc/451933320.html,yers import Dense
import keras
(2).导入数据源,数据源地址:/opt/algorithm/BPNet/wine.txt
df_wine = pd.read_csv("/opt/algorithm/BPNet/wine.txt", header=None).sample(frac=1) (3).查看数据
df_wine.head()
第三步:数据预处理
(1).划分60%数据
p = 0.6
cut = int(np.ceil(len(df_wine) * p))
(2).划分数据集
df_wine_train = df_wine.iloc[:cut]
df_wine_test = df_wine.iloc[cut:]
(3).类别标识编码(深度学习常用手段,类别1 = (1,0),类别2 = (0,1),类别3 = (0,0)) label_train = pd.DataFrame(df_wine_train[0])
label_train["one-hot_1"] = label_train[0].map(lambda x: 1 if (x == 1) else 0) label_train["one-hot_2"] = label_train[0].map(lambda x: 1 if (x == 2) else 0) label_train["one-hot_3"] = [1]*len(label_train)
(4).数据标准化,获取每列均值,标准差
avg_col = df_wine_train.mean()
td_col = df_wine_train.std()
(5).标准化结果
df_train_norm = (df_wine_train - avg_col) / td_col
(6).整理数据
df_train_norm=df_train_norm.drop([0], axis=1).join(label_train[["one-hot_1", "one-hot_2"]]) (7).构建神经网络需要的数据结构
df_train_net = np.array(df_train_norm)
train_data_x = df_train_net[:, 0:13]
train_data_y = df_train_net[:, 13:]
第四步:搭建神经网络
(1).构建神经网络,模型为13->10->20->2 网络
model = Sequential()
(2).建立全连接层-首层需要指定输入层维度
model.add(Dense(units=10, # 输出维度,即本层节点数
input_shape=(13,), # 输入维度
activation="sigmoid", # 激活函数
use_bias=True, # 使用偏置
kernel_regularizer=keras.regularizers.l2(0.001) # 正则化
)
)
model.add(Dense(units=20, # 输出维度,即本层节点数输入维度自动适配上一层activation="sigmoid", # 激活函数
use_bias=True, # 使用偏置
kernel_regularizer=keras.regularizers.l2(0.001) # 正则化
)
)
model.add(Dense(units=2, # 输出维度,即本层节点数输入维度自动适配上一层activation="sigmoid", # 激活函数,
use_bias=True, # 使用偏置
kernel_regularizer=keras.regularizers.l2(0.001) # 正则化
)
)
第五步:定义模型训练方法,损失函数,停止规则以及训练参数并训练网络
(1).建立评估函数,优化方法:随机梯度下降法SGD
sgd = keras.optimizers.SGD(lr=0.01, # 学习速率
decay=1e-7, # 每次更新后的学习率衰减值
momentum=0.8, # 学习动量
nesterov=True # 确定是否使用Nesterov动量
)
(2).设计目标误差函数,以及训练方法
https://www.360docs.net/doc/451933320.html,pile(loss='mean_squared_error', optimizer=sgd)
(3).提前结束训练的阈值,下面参数,观察误差,连续5次无改善.则结束训练
early_stopping = keras.callbacks.EarlyStopping(monitor='loss', patience=5, verbose=0, mode='auto')
(4).模型训练,写入数据,目标,迭代次数,批数,训练详情(0不显示),训练提早结束条件
model.fit(train_data_x, train_data_y, epochs=1000, batch_size=32, verbose=1, callbacks=[early_stopping])
第六步:模型应用于测试集,并输出准确率
(1).模型预测
label_test = pd.DataFrame(df_wine_test[0])
label_test["one-hot_1"] = label_test[0].map(lambda x: 1 if (x == 1) else 0)
label_test["one-hot_2"] = label_test[0].map(lambda x: 1 if (x == 2) else 0)
(2).标准化结果
df_test_norm = (df_wine_test - avg_col) / td_col
(3).整理数据
df_test_norm = df_test_norm.drop([0], axis=1).join(label_test[["one-hot_1", "one-hot_2"]]) (4).构建神经网络需要的数据结构
df_test_net = np.array(df_test_norm)
test_data_x = df_test_net[:, 0:13]
test_data_y = df_test_net[:, 13:]
predicted = model.predict(test_data_x)
F1 = pd.DataFrame(predicted)
F1.columns = ["predicted_1", "predicted_2"]
F1["predicted_1"] = F1["predicted_1"].map(lambda x: 1.0 if (x > 0.5) else 0.0)
F1["predicted_2"] = F1["predicted_2"].map(lambda x: 1.0 if (x > 0.5) else 0.0)
F2 = pd.DataFrame(test_data_y)
F2.columns = ["test_1", "test_2"]
F = F1.join(F2)
acc = len(F[(F["predicted_1"] == F["test_1"]) & (F["predicted_2"] == F["test_2"])]) * 1.0 / len(F)
(5).输出准确率
print("准确率%s " % (acc))
第七步:可以通过以下命令执行python文件,查看最终结果
python /opt/algorithm/BPNet/BPNet.py
【问题与回答】
1、Q:为什么要进行标准化处理?
A:不同的神经网络,对数据要求不一样。一般来说神经网络模型属于参数体量巨大的模型,一般需要进行参数约束以达到提高模型泛化性能的目的,一般处理方法有两种,传统方式,对参数施
加正则化项,让参数绝对值不会过大,一般正则化方式有L2,L1两种方式,必须对数据进行无量纲标准化。另一种方式是网络单元随机失效,即训练过程中随机地让一些神经元放弃迭代,在大数据体量下,随机失效效率更高。
2、Q:学习速率的选择?
A:学习速率加大可以加快训练速度,但学习速率太大会使被调量变化太快,一方面导致网络训练跳出最佳值点,另一方面导致计算机发生溢出。采取变学习速率是一种好的方法在接近最佳点,学习速率必须非常小。本例采用动量方式,属于可变速率学习,参数调优上,需要经验的累积,目前尚没有一套完善的理论用于对网络参数调优上,如果时间允许,可以采取硬遍历或者遗传算法进行参数探索。
3、Q:神经网络类别为什么需要用独热编码的方式,而不使用[1,2,3]
A:从输出层开,其激活函数是sigmoid,属于二类分类函数,所以用独热编码方式更容易让网络理解需求意图。
其他关于网络的注意点,请看算法介绍ppt