Stanford 机器学习 Week5 作业: Neural Networks: Learning

randInitializeWeight

epsilon_init = 0.12;
W = rand(L_out, 1 + L_in) * 2 * epsilon_init - epsilon_init;

sigmoidGradient

g = sigmoid(z) .* (1 - sigmoid(z));

nnCostFunction

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));
J = 0;
Theta1_grad = zeros(size(Theta1));
Theta2_grad = zeros(size(Theta2));

a1 = [ones(m,1) X];
z2 = a1 * Theta1';
a2 = sigmoid(z2);
a2 = [ones(m,1) a2];
z3 = a2 * Theta2';
preOut = sigmoid(z3);
trueOut = zeros(size(preOut));
for i = 1:m
    trueOut(i,y(i)) = 1;
end

tmp = trueOut .* log(preOut) + (1 - trueOut) .* log(1 - preOut);
J = -1.0/m * sum(tmp(:));
t1 = Theta1(:,2:end) .* Theta1(:,2:end);
t2 = Theta2(:,2:end) .* Theta2(:,2:end);
J = J + lambda / 2 / m * (sum(t1(:)) + sum(t2(:)));

epi3 = (preOut - trueOut)';
epi2 = Theta2(:,2:end)' * epi3 .* sigmoidGradient(z2)';
Theta2_grad  =  (Theta2_grad + epi3 * a2) / m;
Theta1_grad  =  (Theta1_grad + epi2 * a1) / m;


Theta2_grad(:,2:end) = Theta2_grad(:,2:end) + lambda / m * Theta2(:,2:end);

Theta1_grad(:,2:end) = Theta1_grad(:,2:end) + lambda / m * Theta1(:,2:end);

这段代码调了一段时间,虽然题目建议写成loop的,我还是用向量化实现了。
几个重点:
1.ai是包含bias unit的,epi,zi是不包含bias unit的
2.epi是unitnum * m 的,而不是相反

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值