Обратное распространение ошибки
> |
restart; with(LinearAlgebra):
|
В первой строке - смещения, в первом столбце - веса от узла 1 2-го уровня к узлам 1 и 2 первого,
во втором столбце - веса от узла 2 2-го уровня к узлам 1 и 2 первого
Функция активности
> |
sgm:=proc(x) 1/(1+exp(-x));end:
|
> |
W1:=Matrix([[2,2],[-2,3 ],[-2 ,3]]):
|
Веса 2-го слоя
> |
W2:=Matrix([[3, -2],[-2,2],[-4 ,2]]):
|
Веса 3-го слоя
> |
W3:=Matrix([[-2],[3],[1]]):
|
Сигнал входной. На 1-м месте всегда 1 - это активность смещения
> |
U0:=Vector[row]([1,0.1,0.9]):
|
Сумматор промежуточного слоя
Применили ее к сигналу, полученному на промеж слой, получили выход на промеж слое - он же (вместе с 1) вход для след слоя
Добавили 1 на 1-е место
> |
U1out:=Vector(3,[1,z]):
|
Перемножили (сумматор)
Выход
> |
U2out:=Vector(3,[1,z]):
|
Перемножили (сумматор)
> |
delt3:=z[1]*(1-z[1])*(t-z[1]);
|
delt3 := 0.1254905134
> |
delt2:=Vector(2,[delt3*W3[2,1],delt3*W3[3,1]]);
|
> |
delt2a:=map(j,U2out)[2..-1]:
|
> |
U2d:=Vector(2,[delt2]);
|
> |
delt2r:=Zip( `*`, U2d, delt2a);
|
> |
AA:=convert(W2.delt2r,Matrix);
|
> |
delt1:=DeleteRow(AA,1);
|
> |
delt1a:=map(j,U1out)[2..-1];
|
> |
U1d:=Vector(2,[delt1]);
|
> |
delt1r:=Zip( `*`, U1d, delt1a);
|
> |
W1:=Zip(`+`,W1,Transpose(delt1r.U0*0.8));
|
> |
W2:=Zip(`+`,W2,Transpose(delt2r.U1out*0.8));
|
> |
W3:=Zip(`+`,W3,Transpose(convert(U2out*delt3*0.8,Matrix)));
|
|