108 lines
3.5 KiB
Mathematica
108 lines
3.5 KiB
Mathematica
|
function cae = caenumgradcheck(cae, x, y)
|
||
|
epsilon = 1e-4;
|
||
|
er = 1e-6;
|
||
|
disp('performing numerical gradient checking...')
|
||
|
for i = 1 : numel(cae.o)
|
||
|
p_cae = cae; p_cae.c{i} = p_cae.c{i} + epsilon;
|
||
|
m_cae = cae; m_cae.c{i} = m_cae.c{i} - epsilon;
|
||
|
|
||
|
[m_cae, p_cae] = caerun(m_cae, p_cae, x, y);
|
||
|
d = (p_cae.L - m_cae.L) / (2 * epsilon);
|
||
|
|
||
|
e = abs(d - cae.dc{i});
|
||
|
if e > er
|
||
|
disp('OUTPUT BIAS numerical gradient checking failed');
|
||
|
disp(e);
|
||
|
disp(d / cae.dc{i});
|
||
|
keyboard
|
||
|
end
|
||
|
end
|
||
|
|
||
|
for a = 1 : numel(cae.a)
|
||
|
|
||
|
p_cae = cae; p_cae.b{a} = p_cae.b{a} + epsilon;
|
||
|
m_cae = cae; m_cae.b{a} = m_cae.b{a} - epsilon;
|
||
|
|
||
|
[m_cae, p_cae] = caerun(m_cae, p_cae, x, y);
|
||
|
d = (p_cae.L - m_cae.L) / (2 * epsilon);
|
||
|
% cae.dok{i}{a}(u) = d;
|
||
|
e = abs(d - cae.db{a});
|
||
|
if e > er
|
||
|
disp('BIAS numerical gradient checking failed');
|
||
|
disp(e);
|
||
|
disp(d / cae.db{a});
|
||
|
keyboard
|
||
|
end
|
||
|
|
||
|
for i = 1 : numel(cae.o)
|
||
|
for u = 1 : numel(cae.ok{i}{a})
|
||
|
p_cae = cae; p_cae.ok{i}{a}(u) = p_cae.ok{i}{a}(u) + epsilon;
|
||
|
m_cae = cae; m_cae.ok{i}{a}(u) = m_cae.ok{i}{a}(u) - epsilon;
|
||
|
|
||
|
[m_cae, p_cae] = caerun(m_cae, p_cae, x, y);
|
||
|
d = (p_cae.L - m_cae.L) / (2 * epsilon);
|
||
|
% cae.dok{i}{a}(u) = d;
|
||
|
e = abs(d - cae.dok{i}{a}(u));
|
||
|
if e > er
|
||
|
disp('OUTPUT KERNEL numerical gradient checking failed');
|
||
|
disp(e);
|
||
|
disp(d / cae.dok{i}{a}(u));
|
||
|
% keyboard
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
for i = 1 : numel(cae.i)
|
||
|
for u = 1 : numel(cae.ik{i}{a})
|
||
|
p_cae = cae;
|
||
|
m_cae = cae;
|
||
|
p_cae.ik{i}{a}(u) = p_cae.ik{i}{a}(u) + epsilon;
|
||
|
m_cae.ik{i}{a}(u) = m_cae.ik{i}{a}(u) - epsilon;
|
||
|
[m_cae, p_cae] = caerun(m_cae, p_cae, x, y);
|
||
|
d = (p_cae.L - m_cae.L) / (2 * epsilon);
|
||
|
% cae.dik{i}{a}(u) = d;
|
||
|
e = abs(d - cae.dik{i}{a}(u));
|
||
|
if e > er
|
||
|
disp('INPUT KERNEL numerical gradient checking failed');
|
||
|
disp(e);
|
||
|
disp(d / cae.dik{i}{a}(u));
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
disp('done')
|
||
|
|
||
|
end
|
||
|
|
||
|
function [m_cae, p_cae] = caerun(m_cae, p_cae, x, y)
|
||
|
m_cae = caeup(m_cae, x); m_cae = caedown(m_cae); m_cae = caebp(m_cae, y);
|
||
|
p_cae = caeup(p_cae, x); p_cae = caedown(p_cae); p_cae = caebp(p_cae, y);
|
||
|
end
|
||
|
|
||
|
%function checknumgrad(cae,what,x,y)
|
||
|
% epsilon = 1e-4;
|
||
|
% er = 1e-9;
|
||
|
%
|
||
|
% for i = 1 : numel(eval(what))
|
||
|
% if iscell(eval(['cae.' what]))
|
||
|
% checknumgrad(cae,[what '{' num2str(i) '}'], x, y)
|
||
|
% else
|
||
|
% p_cae = cae;
|
||
|
% m_cae = cae;
|
||
|
% eval(['p_cae.' what '(' num2str(i) ')']) = eval([what '(' num2str(i) ')']) + epsilon;
|
||
|
% eval(['m_cae.' what '(' num2str(i) ')']) = eval([what '(' num2str(i) ')']) - epsilon;
|
||
|
%
|
||
|
% m_cae = caeff(m_cae, x); m_cae = caedown(m_cae); m_cae = caebp(m_cae, y);
|
||
|
% p_cae = caeff(p_cae, x); p_cae = caedown(p_cae); p_cae = caebp(p_cae, y);
|
||
|
%
|
||
|
% d = (p_cae.L - m_cae.L) / (2 * epsilon);
|
||
|
% e = abs(d - eval(['cae.d' what '(' num2str(i) ')']));
|
||
|
% if e > er
|
||
|
% error('numerical gradient checking failed');
|
||
|
% end
|
||
|
% end
|
||
|
% end
|
||
|
%
|
||
|
% end
|