Funkcje aktywacji:
function[a] = skok(we, b)
[S, Q]=size(we);
we=we+b*ones(1, Q);
a=(we>=0);
function[a] = signum(we,b)
[S, Q]=size(we);
we=we+b*ones(1, Q);
% a=(we>=0);
% a=a+~a*(-1);
a=(we>=0)+(we<0)*(-1);
function[a] = sigmoidalna(we, b, beta)
[S, Q]=size(we);
we=we+b*ones(1, Q);
a=1./(1+exp(-2*beta*we));
=============================
function [dw,db] = korekta (wu, we, bl)
dw=wu*we*bl';
[r,q]=size(we);
db=wu*bl*ones(q,1);
function [bl] = blad (rodz,wy,bl,wa)
%rodz s lub t
if nargin==3
if rodz=='s'
bl= wy.*(1-wy).*bl;
else
bl= (1-wy.^2).*bl;
end
elseif nargin==4
if rodz=='s'
bl= wy.*(1-wy).*(wa*bl);
else
bl= (1-wy.^2).*(wa*bl);
end
else
disp('blad');
bl=NaN;
end
MADALINE XOR 2 NEURONY
%2 neurony w 1 warstwie
p=[0 1 0 1;
0 1 1 0];
% p=[2x4] RxQ
t=[0 0 1 1];
% t=[1x4] SxQ
w1=rands(2,2);
w2=rands(2,1);
b1=rands(2,1);
b2=rands(1,1);
lr=0.2;
ME=5000;
tr=[];
for i=1 : ME
a1=sigmoidalna(w1'*p,b1);
a2=sigmoidalna(w2'*a1,b2);
e=t-a2;
SSE=sum(sum(e.^2));
tr=[tr SSE];
if (SSE < 0.01)
break;
else
d2= a2.*(1-a2).*e;
d1= a1.*(1-a1).*(w2*d2);
dw2=lr*a1*d2';
dw1=lr*p*d1';
db2=lr*d2*ones(4,1);
db1=lr*d1*ones(4,1);
w1=w1+dw1;
b1=b1+db1;
w2=w2+dw2;
b2=b2+db2;
end
end
MOMENTUM ADAPTACJA
p = [-1:0.1:1];
t = [-.9602 -.5770 -.0729 .3771 .6405 .6600 .4609 .1336 -.2013 -.4344 -.5000 -.3930 -.1647 .0988 .3072 .3960 .3449 .1816 -.0312 -.2189 -.3201];
tn=(t-min(t))./(max(t)-min(t));
w1=rands(1,4);
b1=rands(4,1);
w2=rands(4,1);
b2=rands(1,1);
beta=0.5;
% ***momentun+adaptacja***
oldSSE=10^6;
mc=0.1;
olddw1=0;
olddb1=0;
olddw2=0;
olddb2=0;
lr=0.65;
lr2=0.65;
ME=10000;
tr3=[];
for i=1:ME
a1=sigmoidalna(w1'*p,b1,beta);
a2=sigmoidalna(w2'*a1,b2,beta);
e=tn-a2;
SSE=sum(sum(e.^2));
tr3=[tr3 SSE];
if SSE<0.05
break
else
d2=blad2('s',a2,e);
d1=blad2('s',a1,d2,w2);
if oldSSE>SSE
lr=lr*1.05;
lr2=lr2*1.05;
else
lr=lr*0.95;
lr2=lr2*0.95;
end
[dw2,db2]=korekta(lr2,a1,d2);
[dw1,db1]=korekta(lr,p,d1);
w1=w1+(1-mc)*dw1+mc*olddw1;
b1=b1+(1-mc)*db1+mc*olddb1;
w2=w2+(1-mc)*dw2+mc*olddw2;
b2=b2+(1-mc)*db2+mc*olddb2;
olddw1=dw1;
olddb1=db1;
olddw2=dw2;
olddb2=db2;
oldSSE=SSE;
end
end
---------------------------------------------
function [bl]= blad2(czy,wy,bl,wa)
switch czy
case 't'
if (nargin>3)
bl=(1-wy.^2).*(wa*bl);
else
bl=(1-wy.^2).*bl;
end
case 's'
if (nargin>3)
bl=wy.*(1-wy).*(wa*bl);
else
bl=wy.*(1-wy).*bl;
end
otherwise
disp('podaj t albo s')
end
MADALINE
p=[1 0 0 0.5 -2 2 3 1;
0 1 0 0.5 -1 2 1 2;
0 0 1 0 -6 2 1 1 ];
% p=[3x8]
t=[1 1 1 1 1 0 0 0;
1 1 1 1 1 0 0 0;
1 1 1 1 1 0 0 0;
1 1 1 1 1 0 0 0 ];
% t=[4x8]
w=rands(3,4);
b=rands(4,1);
lr=0.6;
ME=100;
tr=[];
for i=1 : ME
a=skok(w'*p,b);
e=t-a;
SSE=sum(sum(e.^2));
tr=[tr SSE];
if SSE == 0
break;
else
dw=lr*p*e';
db=e*ones(8,1);
w=w+dw;
b=b+db;
end
end
function[a]=tanh(we, b)
[S, Q]=size(we);
we=we+b*ones(1, Q);
y=(1-exp(-we))./(1+exp(-we))
function [N] = wektor(M)
[w, k]=size(M);
N=reshape(M,1,w*k)';