после прочтения крутой истории в https://towardsdatascience.com/how-to-build-your-own-neural-network-from-scratch-in-python-68998a08e4f6
я решил сделать это и для пользователей Matlab
Пойдем !!
Класс :
=================
classdef Deepnet
%2 layer net
% Подробное объяснение здесь
properties
input=[];
output= [];
weights1 =[];
weights2 = [] ;
y = [];
layer1=[];
nw=4;
> конец
=============
Давайте определим сигмовидную функцию и ее производную:
===========
function [sigOut] = sigmoidLoc(obj,x)
sigOut = 1./(1+ exp(-x));
end
function [sigDer] = sigmoid_derivative(obj,x)
sigDer = x .* (1.0 — x);
end
======================
Конструктор класса:
вес инициализируется случайным образом
у нас есть ввод 4*3
вес1 3*4
вес2 4*1
выход 4*1
Слой 1 = сигмоид (w1 * x + b) = 4 * 3 * 3 * 4 = 4 * 4
выход = сигмоид (Layer1 * w2) = 4 * 4 * 4 * 1 = 4 * 1
=========
методы
function obj = Deepnet(xin,yout)
obj.input=xin;
obj.y=yout;
obj.output=zeros (размер(obj.y));
obj.weights1=randn(size(xin,2),obj.nw);
obj.weights2=randn(obj.nw,1);
конец
=================
Шаг вперед
function obj = feedforward(obj)
obj.layer1 = obj.sigmoidLoc(obj.input*obj.weights1);
obj.output = obj.sigmoidLoc(obj.layer1 * obj.weights2);
конец
Обратное распространение
function obj =backprop(obj)
% применение цепного правила для нахождения производной функции потерь по весам2 и весам1
d_weights2 = (obj.layer1'* ( 2*(obj.y — obj.output) .* obj.sigmoid_derivative(obj.output)));
d_weights1 = (obj.input' * ((2*(obj.y — obj.output) . * obj.sigmoid_derivative(obj.output)* obj.weights2') .* obj.sigmoid_derivative(obj.layer1)));
% обновить веса производной (наклоном) функции потерь
obj.weights1 = obj.weights1 + d_weights1;
obj.weights2 = obj.weights2 + d_weights2;
end
Давайте проверим!!
x= [ 0 0 1
0 1 1
1 0 1
1 1 1];
y=[0 1 1 0]’;
mydeep=глубокая сеть(х,у);
%% run
for i =1:2500
mydeep=mydeep.feedforward();
mydeep=mydeep.backprop();
end
mydeep.output
Результат :
ответ =
0.0168
0.9792
0.9911
0.0133
Надеюсь, всем понравится блог !!