-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathBP.m
71 lines (62 loc) · 2.5 KB
/
BP.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
classdef BP < handle
% Back Propagation
% Construction: input layer -> hidden layer -> output layer
% This code is based on <<Machine Learning>> written by Zhihua Zhou(P101-104)
properties(SetAccess = private)
nHidden = 0; % number of hidden nodes
nIter = 0; % number of iterations
nBatch = 0; % batch size
WA = []; % weights between input layer and hidden layer
theta = []; % bias of hidden layer
WB = []; % weights between hidden layer and output layer
gamma = []; % bias of output layer
end
methods
% constructure
function Obj = BP(nHidden,nIter,nBatch)
Obj.nHidden = nHidden;
Obj.nIter = nIter;
Obj.nBatch = nBatch;
end
% train
function train(Obj,X,T)
[N,D] = size(X);
L = size(T,2); % number of output nodes
if isempty(Obj.WA) || isempty(Obj.WB) || isempty(Obj.theta) || isempty(Obj.gamma)
Obj.WA = randn(Obj.nHidden,D);
Obj.theta = randn(Obj.nHidden,1);
Obj.WB = randn(L,Obj.nHidden);
Obj.gamma = randn(L,1);
end
eta = 1e-1; % learn rate
MSE = zeros(1,Obj.nIter);
for i = 1 : Obj.nIter
select = randperm(N,Obj.nBatch);
MSEt = 0;
for j = 1 : Obj.nBatch
[Z,Y] = Obj.predict(X(select(j),:));
% update WB and gamma
g = (T(select(j),:)-Z).*Z.*(1-Z);
Obj.WB = Obj.WB + eta*g'*Y';
Obj.gamma = Obj.gamma - eta*g';
% update WA and theta
e = Obj.WB'*g'.*Y.*(1-Y);
Obj.WA = Obj.WA + eta*e*X(select(j),:);
Obj.theta = Obj.theta - eta*e;
MSEt = MSEt + mse(Z-T(select(j),:));
end
MSE(i) = MSEt/Obj.nBatch;
end
figure;
plot(1:Obj.nIter,MSE,'-r','LineWidth',1.4);
xlabel('Epoch');
ylabel('MSE');
title('BP');
end
% predict
function [Z,Y] = predict(Obj,X)
Y = 1./(1+exp(-Obj.WA*X'+Obj.theta));
Z = 1./(1+exp(-Obj.WB*Y+Obj.gamma))';
end
end
end