bp神经网络matlab feedfollownet,BP神经网络模型:Matlab
本文详细阐述了如何利用计量统计软件Matlab(2017a MAC)构建BP神经网络模型的过程。其中所采用的核心数学模型基于前馈神经网络理论。
整理数据
本例中的数据来自于Matalab提供的内置数据,可以通过代码
load bodyfat_dataset
获得,为方便其他软件读取,已经将数据复制粘贴到Excel中
在此例中
每个神经元均包含共计N(本例中为)\texttt{ }^{N}\texttt{ }= 256\texttt{ }^{N}\texttt{ }= 16\texttt{ }^{N}\texttt{ }= 4\texttt{ }^{N}\texttt{ }= 8\texttt{ }^{N}\texttt{ }= 3\texttt{ }}的数据样本,在深度学习算法中通常会将这些样本划分为若干组来进行批量训练与验证操作。\ \其中每一组中的最后一点会被单独分离出来作为独立的一组用于评估当前所建立的深度学习算法的整体性能表现。\ \在实际应用中,则会采用其余的所有样本来进行算法参数的学习与优化过程。\ \这种划分方法有助于在有限的数据资源下实现最优的学习效果与验证效果之间的平衡。\ \
在Matlab中输入数据
1、点击打开 Matlab ,确保保存的Excel文件和软件路径一致

在 Editor 界面中对代码进行编辑,在其中执行 clc 命令以清除 Command Window,在同时调用 clear 命令以清除Workspace中的数据
在 Editor 界面中进行代码编辑时,在其中使用 clc 命令清除 Command Window,并调用 clear 命令清除Workspace
clcclear
Note 1:
选中代码,点击鼠标右键,选择 Evaluate Selection 执行选中代码

采用 Excel 的 xlsread 函数来获取数据信息。具体来说,在函数的第一个参数处使用双引号包裹文件名称,在第二个参数指定工作表所在的存储位置,在第三个参数则用于标识目标数据区域,并用双引号将其括起来。
clccleardata=xlsread('bodyfat_dataset',1,' A1:N252'
运行代码后,在Workplace页面上新增了变量。这些新变量由一个矩阵表示各个变量,每一行对应各个数据。

进行BP神经网络建模
数据录入完成后,继续在Editor界面进行操作
首先使用feedforwardnet函数构建模型结构,并规定其中参数20代表隐层节点的数量为20个。具体而言,在输入层与隐层之间采用了Hyperbolic tangent类型的激活功能,在隐层与输出层之间采用了Sigmoid类型的激活功能
清除工作区中的变量并加载 bodyfat_dataset 数据集到工作区中;
然后创建一个包含 20 个神经元的前馈神经网络;
接着设置第一层的传递函数为双曲正切 sigmoid 激活函数;
最后设置第二层的传递函数为逻辑斯蒂 sigmoid 激活功能。
2、对原始数据进行拆分,前251个数据用来训练,最后一个用来测试
清除工作区变量data并加载训练数据
3、利用train对模型进行训练,遵循反向修改权重的原则
初始化数据集bodyfat_dataset中的数据并将其加载至工作区变量data中。随后创建一个包含20个隐藏层节点的前馈人工神经网络结构,并分别对第一层和第二层神经元配置双曲正切sigmoid和逻辑sigmoid型激活函数。接下来将输入样本赋值给输入向量矩阵input,并对测试样本进行赋值得到inputend;同时将目标输出样本赋值给目标向量矩阵target并得到其测试样本部分targetend。最后通过训练算法对神经网络进行学习训练以实现预测功能
在跳动的训练图中可以通过观察该模型各部分来了解其结构:输入层有若干神经元 隐含层有20个 网络结构清晰可见 模型经过17次迭代后能够满足预期目标

4、最后,利用留置的数据进行测试,输出值与目标值的偏差
清除工作空间中的所有变量并清除命令窗口历史记录后加载Excel文件:
data_matrix = xlsread('bodyfat_dataset', 1, 'A1:N252');
创建一个三层前馈神经网络:
net = feedforwardnet(20);
设置隐藏层和输出层的激活函数分别为tansig函数与logsig函数:
net.layers{1}.transferFcn = 'tansig';
net.layers{2}.transferFcn = 'logsig';
定义训练集输入数据:
training_inputs = data_matrix(1:251, 1:13);
定义测试集输入数据:
testing_inputs = data_matrix(end, 1:13);
定义训练集目标输出数据:
training_targets = data_matrix(1:251, 14);
定义测试集目标输出数据:
testing_targets = data_matrix(end, end);
对神经网络进行训练:
trained_net = train(net, training_inputs', training_targets');
计算并返回测试结果:
testing_output - testing_targets
Note 1 :
反复执行代码后观察到结果呈现多样性归因于初始参数值被随机初始化
Note 2 :
因为初始权重是预先设定的,在每次运行中可能会有不同的输出。这也反映出神经网络模型的一些局限性,在实际训练过程中,模型可能会找到多个权值集合,在这些集合中均能实现误差最小化。这些权值集合的数量可能会因具体情况而异。一种可行的方法是在训练过程中保留一部分数据用于验证模型的效果。
5、在代码前添加rng(0),则限定了初始权重,重复运行代码,将得到相同的结果
clc; clear rng;
data = xlsread('bodyfat_dataset', 1, 'A1:N252');
net = feedforwardnet([20]);
net.layers{1}.transferFcn = 'tansig';
net.layers{2}.transferFcn = 'logsig';
input_data = data(1:251, ][:, ];
input_end_data = data(end, :][:, ];
output_data = data(1:251, end][:][:, ];
output_end_data = data(end, end][:][:];
[ net ]= train(net, input_data.', output_data. ');
predicted_output= net(input_end_data. ');
error= predicted_output - output_end_data;
