神经网络 前向传播算法 反向传播算法 吴恩达机器学习第四次作业

随机初始化

function theta = randInitializeWeights( num1,num2 )

epsilon_init=0.12;
theta=rand(num2,num1+1)*2*epsilon_init-epsilon_init;

end

前向传播算法和后向传播算法实现(为计算代价函数的倒数值),加入正则项

function [J,grad] = nnCostFunction(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=length(y);
J=0;
%======================前向传播算法=============================
a1=X;%5000*400
z2=[ones(m,1),a1]*theta1';% 5000*25
a2=sigmoid(z2);
z3=[ones(m,1),a2]*theta2';
a3=sigmoid(z3);%5000*10
%======================代价函数J==============================
%初始化y向量 m*标签数
Y=zeros(m,num_labels);
%按行初始化
for i=1:m
   Y(i,y(i))=1;%目标Y 只有y中对应的标签处为1 其余为0 5000*10
end
%按类别初始化
for i=1:num_labels
    Z(:,i)=(y==i);
end

for i=1:num_labels
    J=J-Z(:,i)'*log(a3(:,i))-(1-Z(:,i))'*log(1-a3(:,i));
end
J=J/m;
%======================加入正则项J==============================
t1=theta1(:,2:end);%注意正则项不包含偏置
t2=theta2(:,2:end);
regularization=lambda/(2*m)*((sum(sum(t1.^2)))+sum(sum(t2.^2)));
J=J+regularization;
%======================后向传播算法============================
d3=a3-Y;%a3:m*10 Y:m*10
d2=d3*theta2(:,2:end).*sigmoidGradient(z2);%z2:m*25
%求第二层偏导
D2=d3'*[ones(m,1),a2];%d3:m*10 a2:m*25-->10*26
theta2_grad=D2/m;
regularization=lambda/m*[zeros(size(theta2,1),1),theta2(:,2:end)];%theta2:10*26
theta2_grad=regularization+theta2_grad;

%求第一层偏导
D1=d2'*[ones(m,1),a1];%m*25 m*401 -->25*401401是因为要计算偏置单元的误差
theta1_grad=D1/m;
regularization=lambda/m*[zeros(size(theta1,1),1),theta1(:,2:end)];%注意偏置单元不用正则化
theta1_grad=regularization+theta1_grad;
grad=[theta1_grad(:);theta2_grad(:)];
end


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值