bigbao_num 2014-08-29 13:44 采纳率: 0%
浏览 4738

matlab实现BP神经网络,训练结果不好,附源代码

希望大家看看,谢谢了!自己看了一整天都不知道哪里出现了问题,编程思想按照经典的机器学习的书

lr=0.05; %lr为学习速率;
err_goal=0.1; %err_goal为期望误差最小值
max_epoch=15000; %max_epoch为训练的最大次数;
a=0.9; %a为惯性系数
Oi=0;
Ok=0; %置隐含层和输出层各神经元输出初值为0
%提供两组训练集和目标值(3输入神经元,2输出)
%X=[1 1;-1 -1;1 1];
%T=[1 1;1 1];
load house_dataset;
x=houseInputs;
t=houseTargets;
%数据的归一化
maxRowx=max(x,[],2);
maxRowt=max(t,[],2);
minRowx=min(x,[],2);
minRowt=min(t,[],2);
% y = ( x - min )/( max - min )
for i=1:size(x,2)
x(:,i)=(x(:,i)-minRowx)./(maxRowx-minRowx);
t(:,i)=(t(:,i)-minRowt)./(maxRowt-minRowt);

end
%初始化wki,wij(M为输入节点j的数量;q为隐含层节点i的数量;L为输出节点k的数量)
[M,N]=size(x);
q=8;
[L,N]=size(t); %N为训练集对数量
wij=rand(q,M);
wki=rand(L,q);%随机值在-0.05到0.05之间
wij0=zeros(size(wij));
wki0=zeros(size(wki));

for epoch=1:max_epoch
for n=1:N %for every example

    neti=wij*x(:,n);%q*1 每个隐藏层的输出
    oi=1./(1+exp(-neti));
    netk=wki*oi;%L*1 每个输出层的输出
    ok=1./(1+exp(-netk));
    deltak=ok.*(1-ok).*(t(:,n)-ok);%输出层的误差项
    deltai=oi.*(1-oi).*(wki'*deltak);%隐藏层de误差项

    %更新对应的权值
    deltawij=lr*deltai*(x(:,n)');
    deltawki=lr*deltak*(ok');
    wij=wij+deltawij;
    wki=wki+deltawki;
    %计算误差函数
    E=0.0;
    for i=1:N %N为训练的总数
        neti=wij*x(:,i);%q*1 每个隐藏层的输出
        oi=1./(1+exp(-neti));
        netk=wki*oi;%L*1 每个输出层的输出
        ok=1./(1+exp(-netk));
        E=E+(ok-t)*(ok-t)';
    end

    E=E/2;
    fprintf('the error is %f, the iteration is %d\n',E,epoch);


end
if E<err_goal
    break;
end

end

  • 写回答

1条回答 默认 最新

  • ChatGPTᴼᴾᴱᴺᴬᴵ 2023-02-28 12:59
    关注

    该回答引用ChatGPT

    这里是您的源代码。在代码的当前形式下,很难确定出问题所在。不过,我可以提供一些关于训练神经网络的建议和注意事项,这些可能有助于您找出问题。

    • 尝试使用不同的学习率(lr)。有时候,使用不同的学习率可以显着影响训练的结果。如果学习率过高,您的模型可能会发生震荡;如果学习率过低,训练可能会变得非常缓慢。您可以尝试使用不同的学习率,并查看它们对训练结果的影响。
    • 尝试改变隐含层节点的数量(q)。选择隐含层节点的数量是一个关键的决定。如果您选择的节点数量太少,您的模型可能无法充分学习数据的特征。如果您选择的节点数量太多,您的模型可能会过度拟合数据,导致泛化能力降低。您可以尝试改变隐含层节点的数量,并查看它们对训练结果的影响。
    • 尝试改变训练数据。有时候,训练数据可能具有一定的噪声或不完整性,这可能会影响模型的性能。您可以尝试使用不同的训练数据集,并查看它们对训练结果的影响。
    • 考虑使用正则化技术。正则化技术可以帮助您控制模型的复杂度,并避免过度拟合。在训练神经网络时,您可以考虑使用L1或L2正则化,或者Dropout等技术。
    • 检查权重的初始化。权重的初始化可能会影响训练结果。在某些情况下,随机初始化可能无法使神经网络的性能达到最佳水平。您可以尝试使用不同的权重初始化方法,并查看它们对训练结果的影响。

    总之,训练神经网络是一项复杂的任务,需要不断尝试和实验。希望这些建议能帮助您找到问题所在,并提高神经网络的性能。

    评论

报告相同问题?

悬赏问题

  • ¥30 帮我写一段可以读取LD2450数据并计算距离的Arduino代码
  • ¥15 C#调用python代码(python带有库)
  • ¥15 矩阵加法的规则是两个矩阵中对应位置的数的绝对值进行加和
  • ¥15 活动选择题。最多可以参加几个项目?
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题
  • ¥20 云服务Linux系统TCP-MSS值修改?
  • ¥20 关于#单片机#的问题:项目:使用模拟iic与ov2640通讯环境:F407问题:读取的ID号总是0xff,自己调了调发现在读从机数据时,SDA线上并未有信号变化(语言-c语言)
  • ¥20 怎么在stm32门禁成品上增加查询记录功能
  • ¥15 Source insight编写代码后使用CCS5.2版本import之后,代码跳到注释行里面