本文讲的是coursera上斯坦福大学机器学习公开课(吴文达)课程第五周Neural Networks :learning 的课后作业。本文给出了作业实现的具体代码,并给出相应的注释和解释,供各位同学共同讨论学习。
吴老师在课程里说过求解神经网络的一般顺序为:
(1)随机生成初始化theta
(2)正向传播,计算h(x)
(3)计算J值
(4)反向传播,计算误差delta,并计算J对矩阵内各个元素的偏导数
(5)利用gradient checking比较反向传播计算得到的偏导数与numerical gradient计算得到的偏导数的结果,确保反向传播准确无误
(6)利用高级优化算法,利用反向传播,得到最小化J,并得到对应的参数theta值即为所求
准备工作:
a.因为给出的sigmiod函数只能求解标量,我们要修改其代码,使其对矩阵也起作用。
修改sigmoid.m,得到以下代码:
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
b.由于反向传播时需要求sigmoid函数的偏导数,需要修改sigmoidGradient.m,要求它对矩阵也有作用。
油微积分可证,g(z)的偏导数为:g(z)*(1-g(z)),具体原因需要参考微积分求导相关章节。
修改sigmoidGradient.m,得到以下代码:
function g = sigmoidGradient(z)
g = zeros(size(z));
g = sigmoid(z) .* (1 - sigmoid(z));%因为要使函数对矩阵也起作用,所以用点乘
end
下面按照本文头部给出的步骤的实现代码:
1.随机生成初始化theta
<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>
2.正向传播,计算h(x)
3.计算代价值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;
4.反向传播,计算偏导数
%利用反向传播法求取偏导数值,实际上这个循环可以和计算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);
5.利用gradient checking比较反向传播计算得到的偏导数与numerical gradient计算得到的偏导数的结果,确保反向传播准确无误
这部分的实现代码已经在checkNNGradients.m中给出
6.利用高级优化算法,利用反向传播,得到最小化J,并得到对应的参数theta值即为所求
这部分代码在ex4.m中已经给出,具体为:
costFunction = @(p) nnCostFunction(p, ...input_layer_size, ...hidden_layer_size, ...num_labels, X, y, lambda);
综上6个步骤,后两个步骤已经给出,前4个步骤可以合为一个文件nnCostFunction.m:
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相关推荐

  1. 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 ...

  2. Stanford机器学习---第五讲. 神经网络的学习 Neural Networks learning

    原文见http://blog.csdn.net/abcjennifer/article/details/7758797,加入了一些自己的理解 本栏目(Machine learning)包含单參数的线性 ...

  3. 遥感图像-Deep Feature Alignment Neural Networks for Domain Adaptation of Hyperspectral Data高光谱数据深度特征对齐神经

    Deep Feature Alignment Neural Networks for Domain Adaptation of Hyperspectral Data高光谱数据领域自适应的深度特征对齐神 ...

  4. 吴恩达机器学习作业4---Neural Networks Learning

    Neural Networks Learning 文章目录 Neural Networks Learning 代码分析 数据集 ex4data1.mat ex4weights.mat 代码分析 首先, ...

  5. 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 % --------- ...

  6. Neural Networks and Deep Learning - 神经网络与深度学习 - Overfitting and regularization - 过拟合和正则化

    Neural Networks and Deep Learning - 神经网络与深度学习 - Overfitting and regularization - 过拟合和正则化 Neural Netw ...

  7. 目标跟踪算法五:MDNet: Learning Multi-Domain Convolutional Neural Networks for Visual Tracking

    目标跟踪算法五:MDNet: Learning Multi-Domain Convolutional Neural Networks for Visual Tracking 原文:https://zh ...

  8. 《Neural networks and deep learning》概览

    最近阅读了<Neural networks and deep learning>这本书(online book,还没出版),算是读得比较仔细,前面几章涉及的内容比较简单,我着重看了第三章& ...

  9. [译]深度神经网络的多任务学习概览(An Overview of Multi-task Learning in Deep Neural Networks)...

    译自:http://sebastianruder.com/multi-task/ 1. 前言 在机器学习中,我们通常关心优化某一特定指标,不管这个指标是一个标准值,还是企业KPI.为了达到这个目标,我 ...

最新文章

  1. 腾讯云无法绑定公网IP问题解释与解决方案。
  2. 对于Python开发者,这本书绝对算得上此生必读之作
  3. 编写一个函数,实现两个字符串的连接功能
  4. Python-EEG工具库MNE中文教程(13)-“bad“通道介绍
  5. linux端口转发到windows,Linux及Windows基于工具的端口转发
  6. linux xorg.0.log,Red Hat无法登录,Cannot open log file /var/log/Xorg.0.log
  7. Leetcode--820:单词的压缩编码(java)
  8. android获取wifi mac地址吗,Android获取当前WiFi的MAC地址-适配所有版本
  9. 【CVTE Web后台开发实习生 线下面试】总结
  10. Zabbix监控Nginx连接状态
  11. oracle数据库导dump,oracle数据导入,导出dump文件
  12. python实现连接池技术
  13. 106.比特率和波特率
  14. 内网渗透 | powershellwmic详解
  15. 网络工程——软科中国大学专业排名
  16. QT里的函数void Q_INIT_RESOURCE ( name )
  17. 开源Excel报表工具:jxls
  18. Hive(11):Hive的函数之内置函数
  19. 我的AI人生:12岁少女变身极客,摇滚老炮当上AI个体户
  20. Menu菜单,MenuBar菜单栏,MenuItem菜单项

热门文章

  1. 【人工智能】AI 公司:DeepMind 公司传
  2. 机器学习—模型估计与优化—线性模型—最小二乘估计
  3. HTTPS是怎么防止劫持的
  4. 【前端开发】Vue + Fabric.js + Element-plus 实现简易的H5可视化图片编辑器
  5. OpenCore 版本升级后清除NVRAM
  6. 使用vcpkg安装opencv-contrib
  7. macos 旧版本 lightroom 找不到新镜头配置文件 新镜头配置导入lr/ps
  8. pytorch应用于MNIST手写字体识别
  9. 【读书笔记】《曾国藩的正面与侧面(三)》
  10. 《图像处理实例》 之 疏密程度统计