после прочтения крутой истории в 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

Надеюсь, всем понравится блог !!