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.222127
7 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:21
2 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 E
for 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; k
end
2 J U/ ~: z* r
欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/)
Powered by Discuz! X3.2