【发布时间】:2012-10-26 16:23:20
【问题描述】:
我正在尝试实现具有 3 层(1 个输入层、1 个隐藏层和 1 个输出层,具有连续结果)的回归 NN。作为基础,我从coursera.org 类中提取了一个分类NN,但改变了成本函数和梯度计算以适应回归问题(而不是分类问题):
我的 nnCostFunction 现在是:
function [J grad] = nnCostFunctionLinear(nn_params, ...
input_layer_size, ...
hidden_layer_size, ...
num_labels, ...
X, y, lambda)
Theta1 = reshape(nn_params(1:hidden_layer_size * (input_layer_size + 1)), ...
hidden_layer_size, (input_layer_size + 1));
Theta2 = reshape(nn_params((1 + (hidden_layer_size * (input_layer_size + 1))):end), ...
num_labels, (hidden_layer_size + 1));
m = size(X, 1);
a1 = X;
a1 = [ones(m, 1) a1];
a2 = a1 * Theta1';
a2 = [ones(m, 1) a2];
a3 = a2 * Theta2';
Y = y;
J = 1/(2*m)*sum(sum((a3 - Y).^2))
th1 = Theta1;
th1(:,1) = 0; %set bias = 0 in reg. formula
th2 = Theta2;
th2(:,1) = 0;
t1 = th1.^2;
t2 = th2.^2;
th = sum(sum(t1)) + sum(sum(t2));
th = lambda * th / (2*m);
J = J + th; %regularization
del_3 = a3 - Y;
t1 = del_3'*a2;
Theta2_grad = 2*(t1)/m + lambda*th2/m;
t1 = del_3 * Theta2;
del_2 = t1 .* a2;
del_2 = del_2(:,2:end);
t1 = del_2'*a1;
Theta1_grad = 2*(t1)/m + lambda*th1/m;
grad = [Theta1_grad(:) ; Theta2_grad(:)];
end
然后我在 fmincg 算法中使用这个函数,但在第一次迭代中 fmincg 结束它的工作。我认为我的渐变是错误的,但我找不到错误。
有人可以帮忙吗?
【问题讨论】:
-
嗨 Mikhail,这是 1 年前的问题,但我想知道您是否已经解决了这个问题?实际上另一个人问了同样的问题,我在那里提供了我的代码,与 Andrew Ng 的 checkNNGradients(lambda) 相比,得到了 1e-4 的相对差异:stackoverflow.com/questions/20648422/… 如果你已经解决了这个问题并且得到的相对差异更小,请更新通过回答您自己的问题;否则希望我的代码有帮助。谢谢
-
那是什么语言??它是 not octave/matlab(这是 Ng 教授所教的......)
-
@javadba,它是八度的
标签: machine-learning neural-network gradient regression