-
Notifications
You must be signed in to change notification settings - Fork 95
/
dbm_get_hidden_raw.m
112 lines (95 loc) · 3.28 KB
/
dbm_get_hidden_raw.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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
% dbm_get_hidden_raw
% Copyright (C) 2011 KyungHyun Cho, Tapani Raiko, Alexander Ilin
%
%This program is free software; you can redistribute it and/or
%modify it under the terms of the GNU General Public License
%as published by the Free Software Foundation; either version 2
%of the License, or (at your option) any later version.
%
%This program is distributed in the hope that it will be useful,
%but WITHOUT ANY WARRANTY; without even the implied warranty of
%MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
%GNU General Public License for more details.
%
%You should have received a copy of the GNU General Public License
%along with this program; if not, write to the Free Software
%Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
%
function [h_mf] = dbm_get_hidden_raw(x0, binary, layers, ...
W, biases, sigmas, ...
max_iter, tol, reg, ...
do_centering, centers)
layers = layers;
n_layers = length(layers);
h_mf = cell(n_layers, 1);
h_mf{1} = x0;
for l = 2:n_layers
if l == n_layers
mult = 1;
else
mult = 2;
end
if l == 2
if binary == 1
h_mf{l} = sigmoid(bsxfun(@plus, mult * h_mf{l-1} * W{l-1}, biases{l}'));
else
h_mf{l} = sigmoid(bsxfun(@plus, mult * bsxfun(@rdivide, h_mf{l-1}, sigmas.^2') * W{l-1}, biases{l}'));
end
else
h_mf{l} = sigmoid(bsxfun(@plus, mult * h_mf{l-1} * W{l-1}, biases{l}'));
end
end
h_mf_prev = h_mf;
for iter = 1:max_iter
diff_err = 0;
for oddeven = [0 1]
for l = 2:n_layers
if mod(l, 2) == oddeven
continue;
end
h_mf{l} = h_mf{l} * 0;
if do_centering
if l > 1
if l == 2
if binary == 1
h_mf{l} = h_mf{l} + bsxfun(@minus, h_mf{l-1}, centers{l-1}') * W{l-1};
else
h_mf{l} = h_mf{l} + bsxfun(@rdivide, h_mf{l-1}, sigmas.^2') * W{l-1};
end
else
h_mf{l} = h_mf{l} + bsxfun(@minus, h_mf{l-1}, centers{l-1}') * W{l-1};
end
end
if l < n_layers
h_mf{l} = h_mf{l} + bsxfun(@minus, h_mf{l+1}, centers{l+1}') * W{l}';
end
else
if l > 1
if l == 2
if binary == 1
h_mf{l} = h_mf{l} + h_mf{l-1} * W{l-1};
else
h_mf{l} = h_mf{l} + bsxfun(@rdivide, h_mf{l-1}, sigmas.^2') * W{l-1};
end
else
h_mf{l} = h_mf{l} + h_mf{l-1} * W{l-1};
end
end
if l < n_layers
h_mf{l} = h_mf{l} + h_mf{l+1} * W{l}';
end
end
h_mf{l} = sigmoid(bsxfun(@plus, h_mf{l}, biases{l}'));
if reg > 0
h_mf{l} = max(h_mf{l} - reg, 0);
end
diff_err = diff_err + sum(sum((h_mf_prev{l} - h_mf{l}).^2));
end
end
%fprintf(2, '%d\n', diff_err);
if diff_err < tol
break;
end
h_mf_prev = h_mf;
end
clear h_mf_prev;