EDA365电子论坛网

标题: 迭代之后,误差反而越来越大的问题 [打印本页]

作者: R_myself    时间: 2022-12-1 11:23
标题: 迭代之后,误差反而越来越大的问题
目前正在做神经网络训练方面的学习,拿一份数据进行了练习,但是对数据进行处理之后,发现在训练过程中,误差随着迭代次数的增加也在增加,之后维持不变,请教各位大神,这可能是出于什么缘故?
+ n9 C% i$ U0 m4 j6 K具体代码如下:
8 Z  Q  x7 _4 ^3 J5 L8 z    err = expectedOut'-out_out;9 i# L3 k0 d" O, }  E0 i1 {6 X/ p6 z
    sse = sumsqr(err);
+ o0 u3 A8 v; e$ U0 ]% B8 s7 |    errRec(i) = sse;                    %记录每次的错误" f4 ?; o. I; I
    fprintf('第%d次迭代  误差: %f\n',i,sse);
( O1 i& A" {3 R% L
$ F$ U9 k! b. Z0 R( f3 B
* N! @0 a* J' K其中,expectedOut是实际值,out_out是经过训练之后得到的结果( d! L7 C. w7 @1 f; m8 a
然后,结果是这样:
9 E& Z5 F/ e" U6 F  Q2 \第1次迭代  误差: 2.124233
/ X/ Q  d) t! }: v- c* p5 v第2次迭代  误差: 8.216954* E. y6 \6 f- w" {$ ]# A3 N
第3次迭代  误差: 6.639643
- a6 A$ h0 W9 _" p( e! M2 M9 Y第4次迭代  误差: 27.220103
- b0 J. W  [* u4 g& M3 m第5次迭代  误差: 27.222127$ i* b% l: ~3 R. e
第6次迭代  误差: 27.2221277 f7 E) x' m) c
第7次迭代  误差: 27.222127
7 X6 V3 \  o4 G* h5 N! J/ A第8次迭代  误差: 27.222127# V7 q. G. L1 k5 ?5 [

1 q& p4 h3 j/ v9 x* p6 q之后误差一直维持不变,想了解一下这是出于什么缘故?是正常情况吗?& T: i) X& a4 g  A) P- |. i, o
" M* ]/ a. f5 n) S. i; F8 |

作者: hfiwioq    时间: 2022-12-1 13:12
(1)判断条件是否有问题,不该迭代却迭代了;(2)迭代方向是否搞反了
作者: TEL15286598    时间: 2022-12-1 13:21
如果方便给更多一点代码会更容易理解
作者: R_myself    时间: 2022-12-1 13:27
TEL15286598 发表于 2022-12-1 13:212 a$ G' }9 ~( |+ X0 P6 n8 l$ Z- @
如果方便给更多一点代码会更容易理解

( ^8 A* a3 C: Q/ J5 j8 r. S+ r' g%开始迭代
  n! g7 ]( N9 o8 s* R  Efor i=1:maxiter
: f) U: ~6 g  l, x2 f! V# {7 n$ I    hid_input = net.w1 * SampInEx;                %3X100& y9 Q8 _$ h3 `* ]* D  o; h$ F; b  d
    hid_out = logsig(hid_input);                  %3X100  1 F. i) y! Y9 |4 N& r5 B
    ou_input1 = [hid_out;ones(1,nTrainNum)];      %4X100
9 Y  n5 Y2 E% c9 k  C3 ^    ou_input2 = net.w2 * ou_input1;               %1X100
0 ]- j1 g+ c$ v. @# Q% s6 K    out_out =logsig(ou_input2);                   %1X100* z( B# R0 ?0 q% l
    out_Rec(:,i) = out_out;                       %记录每次的输出5 z) l0 ^( f& i9 H! t7 u7 O
    err = expectedOut'-out_out;
+ o& f5 [- f( m    sse = sumsqr(err);" r$ d; i' o- V, ~
    errRec(i) = sse;                    %记录每次的错误  [6 f1 O: }& J/ l( @' {1 p
    fprintf('第%d次迭代  误差: %f\n',i,sse);: Q0 f' H% E( z4 O
    iteration = iteration+1;
% F+ l# b) T# h' W2 K   
) M4 }$ H2 S- L    %判断是否收敛; J# {0 C+ ^% W  X+ {% L8 P$ w) J; i
    if sse<=eb) e) n  ?2 w2 E+ a# }/ x+ h
        break;
$ J# w' }* w# L, C8 r- O    end
+ W8 ], |* L2 m$ u0 H   + G5 [2 F. L: _3 Y1 D9 X) s
    %误差反向传播
& O: `- k# E7 A    %隐含层与输出层之间的局部梯度度
! |4 L6 u' I. K# [    DELTA = err.*dlogsig(ou_input2,out_out);3 {0 L9 W" ]. i8 T0 q! I. H9 d
    %输入层与隐含层之间的局部梯度
  L/ U# i, E1 c) e    delta = net.w2(:,1:end-1)'*DELTA.*dlogsig(hid_input,hid_out);7 S9 X: U$ R1 N1 ~% k( N) A0 S# `
    %权值修改量3 V# B3 j4 a- Q  d4 K+ n
    dWEX=DELTA*ou_input1';& G- E/ Y$ I  Y% _& J% H8 [
    dwex=delta*SampInEx';
2 V$ ?' \& d! f; S' p& Q8 [; K    %修改权值,如果不是第一次修改,则使用动量因子
. u# G* i! b  U2 _9 n    if i==1$ A) O- O! t6 e9 R! O+ U7 p$ v
        net.w2 = net.w2+eta*dWEX;3 W( F# ]1 x' W5 C, c2 P1 [
        net.w1 = net.w1+eta*dwex;
$ h5 F% O/ a% W" j    else
1 O" u9 A* R! f6 N4 l6 B+ ]0 x$ i        net.w2 = net.w2+(1-mc)*eta*dWEX+mc*dWEXOld;
2 `  P5 Y- [1 }+ S; t; T6 V" S9 v* p        net.w1 = net.w1+(1-mc)*eta*dwex+mc*dwexOld;& }  i$ \' j: K9 ~/ B! a
    end, q8 h/ K- }) y' w
   9 r1 D6 S6 c, T0 X4 }( q, }
    %记录上一次的权值修改量
/ b( {3 m8 ]+ G/ M, Q4 `/ C    dWEXOld = dWEX;
$ h0 g9 s9 R3 h( y: D    dwexOld = dwex;
% [" s. e& o8 A; L& F+ ]  d; kend
2 J  U/ ~: z* r




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2