Programing Exercise 4:Neural Networks Learning
function g = sigmoid(z)
[m,n] = size(z);
g = zeros(m,n);
for i = 1:m,for j = 1:n,g(i,j) = 1.0 ./ (1.0 + exp(-z(i,j)));%对z的每个元素求计算其逻辑值end
end
end
function g = sigmoidGradient(z)
g = zeros(size(z));
g = sigmoid(z) .* (1 - sigmoid(z));%因为要使函数对矩阵也起作用,所以用点乘
end
<strong>function W = randInitializeWeights(L_in, L_out)
epsilon_init = 0.12;
W = rand(L_out,L_in + 1) * 2 * epsilon_init - epsilon_init;%由于theta需要添加对应偏置单元的列,所以L_in + 1
end
</strong>
%未进行正则化操作
X = [ones(m,1) X];
for i = 1:m, %m为训练样本数,利用for遍历z2 = Theta1 * X(i,:)'; %对第i个训练样本正向传播得到输出h(x),即为a3a2 = sigmoid(z2);a2 = [1; a2];z3 = Theta2 * a2;a3 = sigmoid(z3);J = J + sum(log(1 - a3)) + log(a3(y(i,:))) - log(1 - a3(y(i,:))); %由于输出为10维向量,而y的值是1-10的数字,所以可以用y的值指示a3那些元素加,哪些不加
end %a3(y(i,:))及指示训练样本对应的a3的元素
J = -1/m * J;
%正则化操作
temp = 0;
for i = 1:hidden_layer_size, %对Theta1除了第一列(与偏置神经元对应的那列)元素的平方求和 for j = 2:(input_layer_size + 1),temp = temp + Theta1(i,j)^2;end
endfor i = 1:num_labels, %对Theta2除了第一列(与偏置神经元对应的那列)元素的平方求和 for j = 2:(hidden_layer_size + 1),temp = temp + Theta2(i,j)^2;end
endJ = J + lambda/(2*m)*temp;
%利用反向传播法求取偏导数值,实际上这个循环可以和计算J值得循环合为一个,为了代码清晰,所以分开写了
delta3 = zeros(num_labels,1); %反向传播,输出层的误差
delta2 = zeros(size(Theta1)); %反向传播,隐藏层的误差;输入层不计算误差
for i = 1:m, %m为训练样本数,利用for遍历a1 = X(i,:)';z2 = Theta1 * a1; %对第i个训练样本正向传播得到输出h(x),即为a3a2 = sigmoid(z2);a2 = [1; a2];z3 = Theta2 * a2;a3 = sigmoid(z3);delta3 = a3; %反向传播,计算得偏导数delta3(y(i,:)) = delta3(y(i,:)) - 1;delta2 = Theta2' * delta3 .*[1;sigmoidGradient(z2)];delta2 = delta2(2:end);Theta2_grad = Theta2_grad + delta3 * a2';Theta1_grad = Theta1_grad + delta2 * a1';
end
Theta2_grad = 1/m * Theta2_grad + lambda/m * Theta2; %正则化,修正梯度值
Theta2_grad(:,1) = Theta2_grad(:,1) - lambda/m * Theta2(:,1); %由于不惩罚偏执单元对应的列,所以把他减掉
Theta1_grad = 1/m * Theta1_grad + lambda/m * Theta1; %同理修改Theta1_grad
Theta1_grad(:,1) = Theta1_grad(:,1) - lambda/m * Theta1(:,1);
costFunction = @(p) nnCostFunction(p, ...input_layer_size, ...hidden_layer_size, ...num_labels, X, y, lambda);
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));% Setup some useful variables
m = size(X, 1);% You need to return the following variables correctly
J = 0;
Theta1_grad = zeros(size(Theta1));
Theta2_grad = zeros(size(Theta2));%计算J值
X = [ones(m,1) X];
for i = 1:m, %m为训练样本数,利用for遍历z2 = Theta1 * X(i,:)'; %对第i个训练样本正向传播得到输出h(x),即为a3a2 = sigmoid(z2);a2 = [1; a2];z3 = Theta2 * a2;a3 = sigmoid(z3);J = J + sum(log(1 - a3)) + log(a3(y(i,:))) - log(1 - a3(y(i,:))); %由于输出为10维向量,而y的值是1-10的数字,所以可以用y的值指示a3那些元素加,哪些不加
end %a3(y(i,:))及指示训练样本对应的a3的元素
J = -1/m * J;temp = 0;
for i = 1:hidden_layer_size, %对Theta1除了第一列(与偏置神经元对应的那列)元素的平方求和 for j = 2:(input_layer_size + 1),temp = temp + Theta1(i,j)^2;end
endfor i = 1:num_labels, %对Theta2除了第一列(与偏置神经元对应的那列)元素的平方求和 for j = 2:(hidden_layer_size + 1),temp = temp + Theta2(i,j)^2;end
endJ = J + lambda/(2*m)*temp;%利用反向传播法求取偏导数值,实际上这个循环可以和计算J值得循环合为一个,为了代码清晰,所以分开写了
delta3 = zeros(num_labels,1); %反向传播,输出层的误差
delta2 = zeros(size(Theta1)); %反向传播,隐藏层的误差;输入层不计算误差
for i = 1:m, %m为训练样本数,利用for遍历a1 = X(i,:)';z2 = Theta1 * a1; %对第i个训练样本正向传播得到输出h(x),即为a3a2 = sigmoid(z2);a2 = [1; a2];z3 = Theta2 * a2;a3 = sigmoid(z3);delta3 = a3; %反向传播,计算得偏导数delta3(y(i,:)) = delta3(y(i,:)) - 1;delta2 = Theta2' * delta3 .*[1;sigmoidGradient(z2)];delta2 = delta2(2:end);Theta2_grad = Theta2_grad + delta3 * a2';Theta1_grad = Theta1_grad + delta2 * a1';
end
Theta2_grad = 1/m * Theta2_grad + lambda/m * Theta2; %正则化,修正梯度值
Theta2_grad(:,1) = Theta2_grad(:,1) - lambda/m * Theta2(:,1); %由于不惩罚偏执单元对应的列,所以把他减掉
Theta1_grad = 1/m * Theta1_grad + lambda/m * Theta1; %同理修改Theta1_grad
Theta1_grad(:,1) = Theta1_grad(:,1) - lambda/m * Theta1(:,1);
% =========================================================================% Unroll gradients
grad = [Theta1_grad(:) ; Theta2_grad(:)];end
Programing Exercise 4:Neural Networks Learning相关推荐
- Machine Learning week 5 quiz: Neural Networks: Learning
Neural Networks: Learning 5 试题 1. You are training a three layer neural network and would like to us ...
- Stanford机器学习---第五讲. 神经网络的学习 Neural Networks learning
原文见http://blog.csdn.net/abcjennifer/article/details/7758797,加入了一些自己的理解 本栏目(Machine learning)包含单參数的线性 ...
- 遥感图像-Deep Feature Alignment Neural Networks for Domain Adaptation of Hyperspectral Data高光谱数据深度特征对齐神经
Deep Feature Alignment Neural Networks for Domain Adaptation of Hyperspectral Data高光谱数据领域自适应的深度特征对齐神 ...
- 吴恩达机器学习作业4---Neural Networks Learning
Neural Networks Learning 文章目录 Neural Networks Learning 代码分析 数据集 ex4data1.mat ex4weights.mat 代码分析 首先, ...
- Machine Learning week 4 quiz: programming assignment-Multi-class Classification and Neural Networks
一.ex3.m %% Machine Learning Online Class - Exercise 3 | Part 1: One-vs-all% Instructions % --------- ...
- Neural Networks and Deep Learning - 神经网络与深度学习 - Overfitting and regularization - 过拟合和正则化
Neural Networks and Deep Learning - 神经网络与深度学习 - Overfitting and regularization - 过拟合和正则化 Neural Netw ...
- 目标跟踪算法五:MDNet: Learning Multi-Domain Convolutional Neural Networks for Visual Tracking
目标跟踪算法五:MDNet: Learning Multi-Domain Convolutional Neural Networks for Visual Tracking 原文:https://zh ...
- 《Neural networks and deep learning》概览
最近阅读了<Neural networks and deep learning>这本书(online book,还没出版),算是读得比较仔细,前面几章涉及的内容比较简单,我着重看了第三章& ...
- [译]深度神经网络的多任务学习概览(An Overview of Multi-task Learning in Deep Neural Networks)...
译自:http://sebastianruder.com/multi-task/ 1. 前言 在机器学习中,我们通常关心优化某一特定指标,不管这个指标是一个标准值,还是企业KPI.为了达到这个目标,我 ...
最新文章
- 腾讯云无法绑定公网IP问题解释与解决方案。
- 对于Python开发者,这本书绝对算得上此生必读之作
- 编写一个函数,实现两个字符串的连接功能
- Python-EEG工具库MNE中文教程(13)-“bad“通道介绍
- linux端口转发到windows,Linux及Windows基于工具的端口转发
- linux xorg.0.log,Red Hat无法登录,Cannot open log file /var/log/Xorg.0.log
- Leetcode--820:单词的压缩编码(java)
- android获取wifi mac地址吗,Android获取当前WiFi的MAC地址-适配所有版本
- 【CVTE Web后台开发实习生 线下面试】总结
- Zabbix监控Nginx连接状态
- oracle数据库导dump,oracle数据导入,导出dump文件
- python实现连接池技术
- 106.比特率和波特率
- 内网渗透 | powershellwmic详解
- 网络工程——软科中国大学专业排名
- QT里的函数void Q_INIT_RESOURCE ( name )
- 开源Excel报表工具:jxls
- Hive(11):Hive的函数之内置函数
- 我的AI人生:12岁少女变身极客,摇滚老炮当上AI个体户
- Menu菜单,MenuBar菜单栏,MenuItem菜单项