在看了案例二中的BP神经网络训练及预测代码后,我开始不明白BP神经网络究竟能做什么了。。。 程序最后得到

在看了案例二中的BP神经网络训练及预测代码后,我开始不明白BP神经网络究竟能做什么了。。。 程序最后得到,第1张

网络的训练过程与使用过程了两码事。
比如BP应用在分类,网络的训练是指的给你一些样本,同时告诉你这些样本属于哪一类,然后代入网络训练,使得这个网络具备一定的分类能力,训练完成以后再拿一个未知类别的数据通过网络进行分类。这里的训练过程就是先伪随机生成权值,然后把样本输入进去算出每一层的输出,并最终算出来预测输出(输出层的输出),这是正向学习过程;最后通过某种训练算法(最基本的是感知器算法)使得代价(预测输出与实际输出的某范数)函数关于权重最小,这个就是反向传播过程。
您所说的那种不需要预先知道样本类别的网络属于无监督类型的网络,比如自组织竞争神经网络。

给你一个我的程序,如果自己做不了可以联系我:1526208341
动量梯度下降算法训练 BP 网络
训练样本定义如下:
输入矢量为
p =[-1 -2 3 1
-1 1 5 -3]
目标矢量为 t = [-1 -1 1 1]
close all
clear
echo on
clc
% NEWFF——生成一个新的前向神经网络
% TRAIN——对 BP 神经网络进行训练
% SIM——对 BP 神经网络进行仿真
pause
% 敲任意键开始
clc
% 定义训练样本
% P 为输入矢量
P=[-1, -2, 3, 1; -1, 1, 5, -3];
% T 为目标矢量
T=[-1, -1, 1, 1];
pause;
clc
% 创建一个新的前向神经网络
net=newff(minmax(P),[3,1],{'tansig','purelin'},'traingdm')
% 当前输入层权值和阈值
inputWeights=netIW{1,1}
inputbias=netb{1}
% 当前网络层权值和阈值
layerWeights=netLW{2,1}
layerbias=netb{2}
pause
clc
% 设置训练参数
nettrainParamshow = 50;
nettrainParamlr = 005;
nettrainParammc = 09;
nettrainParamepochs = 1000;
nettrainParamgoal = 1e-3;
pause
clc
% 调用 TRAINGDM 算法训练 BP 网络
[net,tr]=train(net,P,T);
pause
clc
% 对 BP 网络进行仿真
A = sim(net,P)
% 计算仿真误差
E = T - A
MSE=mse(E)
pause
clc
echo off

楼主解决没?这是我知道的
[pn,minp,maxp,tn,mint,maxt]=premnmx(p,t); %归一化数据,方便后面的预测
nettrainParam show = 100; %这里的show是显示步数,每100步显示一次
nettrainParamgoal=00001; %目标误差,训练得到的数据和原始输入
nettrainParamlr = 001; %lr是学习动量,一般越小越好
y1=sim(net,pn); %sim用来预测的
xlswrite('testdata6',tnew1); ?这里的testdata6是excel表格的名称
你可以看看书的,书上都有介绍

摘 要:本文将BP(Back Propagation)神经网络应用到题库试题分值的确定中,以解决目前智能组卷研究中题库试题分值确定的不合理性。在训练网络时,对标准BP算法作了相应改进,以适应该智能模型的建立。通过案例试验,验证了确定试题分值的智能模型的精度是符合实际要求的,在一定程度上为智能化组卷奠定了基础。
关键词:BP算法 题库 试题分值

引言

题库是保证考试题目具有较高质量、更好地达到教育测量目标的重要手段。随着计算机及网络技术,特别是人工智能技术在现代教育中的推广及应用,教育领域对电子测评有了很大的重视,更多地关注题库建设及智能组卷的研发。
目前,市面上已出现了各种各样的题库系统。实际上题库建设仍缺乏科学理论指导,尤其是在试题参数确定上,主观因素影响很大,使题库系统不能很好地实现预期的目标。例如,试题分值的确定一直没有一个很好的解决方案。传统的做法是采用难度赋分法和时间赋分法[1],而没有考虑其它因素的影响,如知识点数、知识点的重要程度等。考虑到试题分值与影响试题分值的参数之间的高度非线性关系,本文利用BP神经网络所具备的模拟人的思维、非线性变换和自学等功能来构建试题分值智能确定模型,以克服传统做法中各种随机性和主观性对分值的影响。

1 基本原理和方法

利用已知样本对BP网络进行训练,使其获得专家经验和对确定试题分值的认识,当对新的样本进行处理时,该网络模拟人的思维并再现专家知识经验,达到客观地确定试题分值的目的,具体步骤是:
① 提取确定试题分值的参数,量化处理为(0,1)内的精确值作为网络输入。
② 利用已有的专家知识库(样本库),通过BP算法对网络进行训练,通过对网络参数及算法参数的调整得到稳定的网络参数――分数确定模型。为了能在实际应用中保证可接受的计算精度,我们在训练网络时,使它在更高的精度下收敛。
③ 输入需要确定分值的相关试题参数,网络根据自学获得的专家知识经验对输入值进行处理,然后输出(0,1)的值作为最终结果(该试题的分值)。

2 分值确定的BP神经网络结构

本文分析总结出影响题库试题分值得7个参数(BP网络的输入向量),作为对该领域问题的首次研究,为了获得足够多的有代表性的训练样本,本文限制参数“题型”的取值为:1、2、3和4,分别代表单选题、多选题、判断改错题和填空题。根据考试理论、命题设计理论,属于这几类题型的每道试题所考察的知识点一般不超过3个,而且最适合考查识记、理解和应用三个认知水平。所以本文亦限制参数“知识点数”取[1,3]之间的整数,同时限制参数“认知层次”的取值为:1、2和3,分别代表识记、理解和应用。从而缩小了样本空间。7个参数的取值见表1。

在神经网络的应用中,网络结构的选择很重要,好的网络结构可以减少网络训练次数,提高网络学习精度。[2]隐含层数越多,神经网络学习速度就越慢,根据Kosmogorov定理,在合理的结构和恰当的权值条件下,3层BP神经网络可以逼近任意的连续函数,因此,我们选取了3层BP网络结构,如图1所示。

图1
其中,输入层节点数目n由影响试题分值参数个数确定,这里n=7,由于输出结果为一个试题分值,故输出节点数为m=1;在总结大量网络结构的基础上,得出隐含层神经元数目的经验公式为

由此本文初步确定隐含层的神经元数目为s=5。在实验仿真时,我们将动态调整隐含层的神经元数目,以获得网络

3 调整BP算法

31 动态调整隐含层单元数目和学习步长
如上所述,初步确定隐含层神经元数目为5,然后,通过人机交互,增加或减少隐含层神经元数目,分析比较全局误差的震荡程度、误差递减程度、误差稳定后的网络精确程度及网络的收敛性能,从而确定隐含层神经元数目。本文训练网络时既没有采用固定步长,也没有采用自适应调整步长的方法,而是采用人机交互动态调整的方法,笔者认为这样虽然麻烦,但对步长的调整是更智能的。
32 选择模式对的方法及全局误差的计算
本文将所有的样本都存储在数据库中,并把2/3的样本作为训练样本,在选择模式对时,从训练样本的第一条记录开始一直到最后一条,如此循环。经过反复实验,验证了这种方法比随机选择的方法更加有效,表现为网络误差递减明显,基本不存在震荡。通过分析,笔者认为,在随机选择方法中,由于随机性,不能保证所有的代表性样本都被选中,使得样本不再代表整体,失去了样本的意义,致使误差递减缓慢,震荡明显,训练不得收敛。采用下式计算全局误差:

其中,fp是输出层的实际输出,y是期望输出,M为训练样本总数,E是全局误差,N为正整数,该值的选择要合理,否则会使网络进入局部极小值,或者误差递减缓慢,震荡明显,训练难于收敛。

4 题库试题分值确定实例及分析

41 样本的选取
样本应很好地代表整体,这就要求必须有足够训练样本,否则样本只能代表整体中的某一部分,这样即使网络训练到了很高的精度,当实际应用时会发现网络误差有时变得很大,根本无法使用。根据这一原则及确定试题分值得参数个数和每一参数的取值,我们至少需要22500个训练样本。考虑到获取样本的难度及分值确定所需要的实际精度,本文从我们正在研发的《计算机文化基础》课程的智能题库中提取了具有高度代表性800个训练样本和400个试验样本,由于题库中的试题的难度、区分度等参数是经过测试得到的,所以是比较可信的,答题时间及分值根据经验人为估算而得。为了提高网络精度,我们又组织了一个专门小组(三位相关专业的教授和7位信息技术教学论专业的硕士研究生)对1200个样本的估计答题时间及分值进行了比较严密的估算,估算值精确到01。估算方法是十位小组成员分别对每个样本的答题时间及分值估算,然后去掉一个最高分和一个最低分,把剩下的八个估算值计算加权平均值,所得的值即为最后的答题时间或分值。
42 样本归一化处理
为了使归一化处理的结果尽可能均匀分布在[0,1]之间,本文采用了如下式所示的归一化方法:

43 确定训练网络的精度
在实际中,我们通常以05的整数倍作为某一试题的分值,所以如果得到的BP网络模型能精确到01就可以了,然后根据类四舍五入的方法把它处理为05的整数倍的一个值。当结果的小数部分小于025时,则舍掉,当介于[025,075],则处理为05,大于等于075,则向整数进1。这是符合实际要求的。然而,经训练达到某一精度的网络在实际应用时,其误差总是围绕某固定值上下波动。特别是当样本的代表性较差时,更是如此。为此,我们在训练样本时,将网络的全局误差设置得比实际要求的更小。本研究将其设为10-5。
44 网络训练过程
本研究在网络训练时,隐含层单元数动态调整,以得到更合适的隐含层单元数目。没有采用动量项(经试验,没有动量项效果更好),步长动态调整,将其初值设为1,然后根据误差递减情况以005的幅度在[0,1]之间调整。循环选择800个训练样本对网络进行训练,每循环m次计算一次全局误差,每循环n(n为m的整数倍)次观察记录一次误差变化情况,通过分析比较决定步长调整方向。训练网络的主要程序代码(c#)如下:
button3_Click(object sender,EventArgs e)
本文为全文原貌 未安装PDF浏览器用户请先下载安装 原版全文 {h_num= intParse(textBox1TextToString());
//动态指定隐含层单元数
wj=new double[h_num];//输出-隐含权值
wij=new double[7,h_num];//隐含-输入权值
hvj=new double[h_num];//隐含层阈值
int i,j;
netj=new double[h_num];//隐含层输入向量
xi=new double[7];//输入层输入向量
comm2=conn1CreateCommand();
hoj=new double[h_num];//隐含层输出向量
ej=new double[h_num];//隐含层的一般误差
//初始化权值、阈值、步长及动量系数
a=doubleParse(textBox2TextToString());
//初始化输出节点阈值
double e1=000001,E1=e1+1,E2=0;
int count=0,count1=0;
for(i=0;i=yb_count+1) ybbh=1;
ybbh=randNext(1,yb_count+1);
comm2CommandText = "select from gyhVIEW
where 样本编号="+ " ’" + ybbh + " ’" ;
dr1 = comm2ExecuteReader();
if (dr1Read())
{for (i = 0;i = 3yb_count)
{ E1 = E2 /3yb_count;count = 0;count1 += 1;
if (count1 >= 1000)
{if (MessageBoxShow(E1ToString() + " a="+ aToString() + "减小步长?","提示信息",
MessageBoxButtonsOKCancel,
MessageBoxIconQuestion) == DialogResultOK)
{ a -= 005;}
if (MessageBoxShow(E1ToString() + "增加步长?","提示信息",
MessageBoxButtonsOKCancel,
MessageBoxIconQuestion) == DialogResultOK)
{ a += 005;} count1 = 0;}}}
通过反复训练和比较分析,最后将网络隐含层单元数目确定为6,每循环3次计算一次全局误差,次每循环3000次观察记录一次误差变化情况,学习步长从1调整到065,最后在065时收敛。共训练了1128万次。模型稳定后,输入层与隐含层的连接权值如图3所示(其中i表示输入层单元序号,wij表示输入层单元i与隐含层单元j的连接权值),隐含层与输出层的连接权值及隐含层阈值如图4所示(其中j表示隐含层单元序号),输出层阈值为-3305475。

观察分析网络模型的测试误差,基本都小于0005,最小值为00001399517,最大值为001044011,完全满足题库试题分值确定所要求的精度(01),符合实际用需求。

结束语

本文将BP神经网络应用到题库试题分值的确定中,为题库试题分值得确定提供了一种可行的方法。在应用BP算法时,动态调整隐含层单元数目,动态调整学习步长,采用循环选择训练样本的模式对选择方法,经过特定次数的循环训练后计算一次全局误差。所有这些均源于本模型的准确建构。另外,如果训练样本能够很好地代表整体,用这种方法将能建立精度更高的确定试题分值的智能模型。

参考文献:
[1]胡中锋,李方教育测量与评价[M]广东高等教育出版社,20037
[2]Hadi,MuhammadNSNeuralnetworks applications in concrete structures Computers and Structures Volume:81,Issue:6,March,2003,pp373-381
[3]姜华,赵洁基于BP神经网络的学习行为评价模型及实现[J]计算机应用与软件,200522,(8):89-91
[4]戴永伟,雷志勇BP网络学习算法研究及其图像识别应用[J]计算机与现代化,200611:68-70
[5]宋乃华,邢清华一种新的基于粒群优化的BP网络学习算法[J]计算机工程,200614:181-183

基金项目:全国教育科学“十一五”规划教育考试学研究重点课题项目(2006JKS3017);山西省教育科学“十一五”规划课题(GH-06106)。

注:“本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。”
本文为全文原貌 未安装PDF浏览器用户请先下载安装 原版全文

这个就只能自己编M文件实现了,给个例子你看看
% script: main_batchm
% 批量方式训练BP网络,实现性别识别
%% 清理
clear all
clc
%% 读入数据
% xlsfile='studentxls';
[data,label]=getdata();
%% 划分数据
[traind,trainl,testd,testl]=divide(data,label);
%% 设置参数
rng('default')
rng(0)
nTrainNum = 60; % 60个训练样本
nSampDim = 2; % 样本是2维的
%% 构造网络
netnIn = 2; % 输入层2个神经元,分别输入身高、体重
netnHidden = 3; % 3个隐含层节点
netnOut = 1; % 1个输出层节点
w = 2(rand(netnHidden,netnIn)-1/2); % nHidden 3 一行代表一个隐含层节点
b = 2(rand(netnHidden,1)-1/2);
netw1 = [w,b];
W = 2(rand(netnOut,netnHidden)-1/2);
B = 2(rand(netnOut,1)-1/2);
netw2 = [W,B];
%% 训练数据归一化
mm=mean(traind);
% 均值平移
for i=1:2
traind_s(:,i)=traind(:,i)-mm(i);
end
% 方差标准化
ml(1) = std(traind_s(:,1));
ml(2) = std(traind_s(:,2));
for i=1:2
traind_s(:,i)=traind_s(:,i)/ml(i);
end
%% 训练
SampInEx = [traind_s';ones(1,nTrainNum)];
expectedOut=trainl;
eb = 001; % 误差容限
eta = 06; % 学习率
mc = 08; % 动量因子
maxiter = 2000; % 最大迭代次数
iteration = 0; % 第一代

errRec = zeros(1,maxiter);
outRec = zeros(nTrainNum, maxiter);
NET=[]; % 记录
% 开始迭代
for i = 1 : maxiter
hid_input = netw1 SampInEx; % 隐含层的输入
hid_out = logsig(hid_input); % 隐含层的输出

ou_input1 = [hid_out;ones(1,nTrainNum)]; % 输出层的输入
ou_input2 = netw2 ou_input1;
out_out = logsig(ou_input2); % 输出层的输出

outRec(:,i) = out_out'; % 记录每次迭代的输出

err = expectedOut - out_out; % 误差
sse = sumsqr(err);
errRec(i) = sse; % 保存误差值
fprintf('第 %d 次迭代 误差: %f\n', i, sse);
iteration = iteration + 1;
% 判断是否收敛
if sse<=eb
break;
end

% 误差反向传播
% 隐含层与输出层之间的局部梯度
DELTA = errdlogsig(ou_input2,out_out);
% 输入层与隐含层之间的局部梯度
delta = netw2(:,1:end-1)' DELTAdlogsig(hid_input,hid_out);

% 权值修改量
dWEX = DELTAou_input1';
dwex = deltaSampInEx';

% 修改权值,如果不是第一次修改,则使用动量因子
if i == 1
netw2 = netw2 + eta dWEX;
netw1 = netw1 + eta dwex;
else
netw2 = netw2 + (1 - mc)etadWEX + mc dWEXOld;
netw1 = netw1 + (1 - mc)etadwex + mc dwexOld;
end
% 记录上一次的权值修改量
dWEXOld = dWEX;
dwexOld = dwex;

end

%% 测试
% 测试数据归一化
for i=1:2
testd_s(:,i)=testd(:,i)-mm(i);
end
for i=1:2
testd_s(:,i)=testd_s(:,i)/ml(i);
end
% 计算测试输出
InEx=[testd_s';ones(1,260-nTrainNum)];
hid_input = netw1 InEx;
hid_out = logsig(hid_input); % output of the hidden layer nodes
ou_input1 = [hid_out;ones(1,260-nTrainNum)];
ou_input2 = netw2 ou_input1;
out_out = logsig(ou_input2);
out_out1=out_out;
% 取整
out_out(out_out<05)=0;
out_out(out_out>=05)=1;
% 正确率
rate = sum(out_out == testl)/length(out_out);

%% 显示
% 显示训练样本
train_m = traind(trainl==1,:);
train_m=train_m';
train_f = traind(trainl==0,:);
train_f=train_f';
figure(1)
plot(train_m(1,:),train_m(2,:),'bo');
hold on;
plot(train_f(1,:),train_f(2,:),'r');
xlabel('身高')
ylabel('体重')
title('训练样本分布')
legend('男生','女生')
figure(2)
axis on
hold on
grid
[nRow,nCol] = size(errRec);
plot(1:nCol,errRec,'LineWidth',15);
legend('误差平方和');
xlabel('迭代次数','FontName','Times','FontSize',10);
ylabel('误差')
fprintf(' ----------------错误分类表----------\n')
fprintf(' 编号 标签 身高 体重\n')
ind= find(out_out ~= testl);
for i=1:length(ind)
fprintf(' %4d %4d %f %f \n', ind(i), testl(ind(i)), testd(ind(i),1), testd(ind(i),2));
end
fprintf('最终迭代次数\n %d\n', iteration);
fprintf('正确率:\n %f%%\n', rate100);

学习率实际和信号分析里的时间常数是一样的,学习率越小 学习会越精细,但同时学习速度也会降低,因为现实中很多模型都是非线性的,犹如一条曲线,梯度下降采用很多小直线迭代去逼近非线性的曲线,如果每一步跨度太大(学习率)就会失去很多曲线的扭曲信息,局部直线化过严重,跨度太小你要到达曲线的尽头就需要很多很多步,这就需要更多的样本,所以这个也要考虑实际问题再来决定学习率的。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/10551088.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-09
下一篇 2023-05-09

发表评论

登录后才能评论

评论列表(0条)

保存