BP神经网络其信号是前向传播的,而在其计算其误差时是反向传播的。
本练习小节是执行反向传播算法并且将其应用到手写数字的识别当中。
1、神经网路
在前面的训练中,可以根据提供了权重值来预测手写数字。在本练习中将使用反向传播算法来为神经网络学习权重参数。
(1)数据的可视化

load('ex4data1.mat');
m = size(X, 1);
% Randomly select 100 data points to display
sel = randperm(size(X, 1));
sel = sel(1:100);
displayData(X(sel, :));

导入手写字体数字,可以得到矩形X和矢量y,其中矩阵X的维度为5000×400,其中5000表示为5000个样本,400表示为每个样本的像素为20×20,矢量y为X中每个样本对应的标签值(y = 1-10)。

m = size(X, 1)为样本的个数;
sel = randperm(size(X, 1))将数据1-m随机进行排序,返回为矢量;
sel = sel(1:100)选取随机序列中的前100的值;
displayData(X(sel, ?)显示样本中第sel个样本图像。

(2)神经网络模型
本小节使用的神经网络如下:

input_layer_size  = 400;  % 20x20 Input Images of Digits
hidden_layer_size = 25;   % 25 hidden units
num_labels = 10;          % 10 labels, from 1 to 10   % (note that we have mapped "0" to label 10)

由于每个样本有400个特征参数,则神经网路的输入层神经个数为400,其输入分类为10个,则设置其输出神经个数为10。

设置其隐藏层神经元个数为25。
(3)损失函数
在没有进行正则化前,神经网络的损失函数为:

function [J grad] = nnCostFunction(nn_params, ...input_layer_size, ...hidden_layer_size, ...num_labels, ...X, y, lambda)

nn_params为矢量化的权重参数Theta1和Theta2;input_layer_size为神经网络输入神经元个数;hidden_layer_size为神经网络隐藏层神经元个数;num_labels为分类数量,即输出神经元个数;X为输入训练数据;y为样本对应的标签;lambda为正则化参数。
先尝试计算第一个样本的损失值:

%使用X的第一个样本计算J
y_label = zeros(num_labels,1);
a1 = [1;X(1,:)'];%第一层神经网络激励,401*1
z2 = Theta1*a1;%第二层神经网络,25*1
a2 = [1;sigmoid(z2)];%第二层神经网络激励,26*1
z3 = Theta2*a2;%第三层神经网络,10*1
a3 = sigmoid(z3);%第三层神经网络激励,10*1
h = a3;%神经网络的输出,10*1
y_label(y(1)) = 1;%第一个数据的标签值,10*1
%通过公式计算出第一个样本数据的损失值
J = (y_label'*log(h)+(1-y_label)'*log(1-h))*(-1);

其结果为:

J =0.0345

使用for循环将所有样本的损失值计算出来并求平均:

%使用for循环计算所有样本的损失并求平均
for i = 1:my_label = zeros(num_labels,1);a1 = [1;X(i,:)'];%第一层神经网络激励,401*1z2 = Theta1*a1;%第二层神经网络,25*1a2 = [1;sigmoid(z2)];%第二层神经网络激励,26*1z3 = Theta2*a2;%第三层神经网络,10*1a3 = sigmoid(z3);%第三层神经网络激励,10*1h = a3;%神经网络的输出,10*1y_label(y(i)) = 1;%第i个数据的标签值,10*1%通过公式计算出第一个样本数据的损失值J = J+(y_label'*log(h)+(1-y_label)'*log(1-h))*(-1);
end
J = J/m;

运行程序有:

Feedforward Using Neural Network ...
Cost at parameters (loaded from ex4weights): 0.287629
(this value should be about 0.287629)

说明使用for循环求损失值代码是正确的。
下面将程序改写成矢量的形式,提高其运行速率。

%改写成矢量计算形式
X = [ones(m,1),X];%对输入样本增加第一列,值为1。5000*401
A1 = X';%第一层激励,输入矩阵。401*5000。
Z2 = Theta1*A1;%第二层神经网络,25*5000
A2 = [ones(1,m);sigmoid(Z2)];%第二层神经网络激励,26*5000
Z3 = Theta2*A2;%第三层神经网络,10*5000
p = sigmoid(Z3);%神经网络的输出,10*5000
y_label = zeros(num_labels,m);%重新改写矩阵y,与神经网络的输出为同一形式
for i = 1:my_label(y(i),i) = 1;
end
J = sum(sum(y_label.*log(p)+(1-y_label).*log(1-p)))/(-m);

其运算结果也为正确。
可以将代码精简为:

y_label = zeros(num_labels,m);%重新改写矩阵y,与神经网络的输出为同一形式
for i = 1:my_label(y(i),i) = 1;
endJ = sum(sum(y_label.*log(sigmoid(Theta2*[ones(1,m);...sigmoid(Theta1*[ones(m,1),X]')]))+...(1-y_label).*log(1-sigmoid(Theta2*[ones(1,m);...sigmoid(Theta1*[ones(m,1),X]')]))))/(-m);

其运行结果为:

Feedforward Using Neural Network ...
Cost at parameters (loaded from ex4weights): 0.287629
(this value should be about 0.287629)

(4)正则化损失函数

正则化损失函数的公式为:

注意:此处公式有误,对Theta1求和时应该是k=2-401,对Theta2求和时应该是k=2-26。
修改和增加代码:

T1_squ = sum(Theta1.*Theta1);
T2_squ = sum(Theta2.*Theta2);
%正则化损失函数
J = sum(sum(y_label.*log(sigmoid(Theta2*[ones(1,m);...sigmoid(Theta1*[ones(m,1),X]')]))+...(1-y_label).*log(1-sigmoid(Theta2*[ones(1,m);...sigmoid(Theta1*[ones(m,1),X]')]))))/(-m)+...(sum(T1_squ(2:end))+sum(T2_squ(2:end)))*lambda/(2*m);

其运行结果为:

Checking Cost Function (w/ Regularization) ...
Cost at parameters (loaded from ex4weights): 0.383770
(this value should be about 0.383770)
Program paused. Press enter to continue.

附上nnCostFunction的所有源代码:

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));%使用X的第一个样本计算J
%y_label = zeros(num_labels,1);
%a1 = [1;X(1,:)'];%第一层神经网络激励,401*1
%z2 = Theta1*a1;%第二层神经网络,25*1
%a2 = [1;sigmoid(z2)];%第二层神经网络激励,26*1
%z3 = Theta2*a2;%第三层神经网络,10*1
%a3 = sigmoid(z3);%第三层神经网络激励,10*1
%h = a3;%神经网络的输出,10*1
%y_label(y(1)) = 1;%第一个数据的标签值,10*1
%通过公式计算出第一个样本数据的损失值
%J = (y_label'*log(h)+(1-y_label)'*log(1-h))*(-1);%使用for循环计算所有样本的损失并求平均
%for i = 1:m
%    y_label = zeros(num_labels,1);
%    a1 = [1;X(i,:)'];%第一层神经网络激励,401*1
%    z2 = Theta1*a1;%第二层神经网络,25*1
%    a2 = [1;sigmoid(z2)];%第二层神经网络激励,26*1
%    z3 = Theta2*a2;%第三层神经网络,10*1
%    a3 = sigmoid(z3);%第三层神经网络激励,10*1
%    h = a3;%神经网络的输出,10*1
%    y_label(y(i)) = 1;%第i个数据的标签值,10*1%通过公式计算出第一个样本数据的损失值
%    J = J+(y_label'*log(h)+(1-y_label)'*log(1-h))*(-1);
%end
%J = J/m;%改写成矢量计算形式:
%X = [ones(m,1),X];%对输入样本增加第一列,值为1。5000*401
%A1 = X';%第一层激励,输入矩阵。401*5000。
%Z2 = Theta1*A1;%第二层神经网络,25*5000
%A2 = [ones(1,m);sigmoid(Z2)];%第二层神经网络激励,26*5000
%Z3 = Theta2*A2;%第三层神经网络,10*5000
%p = sigmoid(Z3);%神经网络的输出,10*5000
%y_label = zeros(10,m);%重新改写矩阵y,与神经网络的输出为同一形式
%for i = 1:m
%    y_label(y(i),i) = 1;
%end
%J = sum(sum(y_label.*log(p)+(1-y_label).*log(1-p)))/(-m);%精简矢量化运算代码如下:
y_label = zeros(num_labels,m);%重新改写矩阵y,与神经网络的输出为同一形式
for i = 1:my_label(y(i),i) = 1;
end
%未正则化的损失函数
%J = sum(sum(y_label.*log(sigmoid(Theta2*[ones(1,m);...
%    sigmoid(Theta1*[ones(m,1),X]')]))+...
%    (1-y_label).*log(1-sigmoid(Theta2*[ones(1,m);...
%    sigmoid(Theta1*[ones(m,1),X]')]))))/(-m);
T1_squ = sum(Theta1.*Theta1);
T2_squ = sum(Theta2.*Theta2);
%正则化损失函数
J = sum(sum(y_label.*log(sigmoid(Theta2*[ones(1,m);...sigmoid(Theta1*[ones(m,1),X]')]))+...(1-y_label).*log(1-sigmoid(Theta2*[ones(1,m);...sigmoid(Theta1*[ones(m,1),X]')]))))/(-m)+...(sum(T1_squ(2:end))+sum(T2_squ(2:end)))*lambda/(2*m);
% -------------------------------------------------------------% =========================================================================% Unroll gradients
grad = [Theta1_grad(:) ; Theta2_grad(:)];end

吴恩达机器学习练习4:神经网络学习(损失函数和正则化)相关推荐

  1. 吴恩达机器学习笔记 —— 9 神经网络学习

    http://www.cnblogs.com/xing901022/p/9344621.html 本章讲述了神经网络的起源与神经元模型,并且描述了前馈型神经网络的构造. 更多内容参考 机器学习& ...

  2. 吴恩达机器学习笔记week8——神经网络 Neutral network

    吴恩达机器学习笔记week8--神经网络 Neutral network 8-1.非线性假设 Non-linear hypotheses 8-2.神经元与大脑 Neurons and the brai ...

  3. 吴恩达机器学习——第三周学习笔记

    二元分类(Binary Classfication) 分类,一种方法是使用线性回归,将所有大于0.5的预测映射为1,将所有小于0.5的预测映射为0.然而,这种方法并不能很好地工作,因为分类实际上不是一 ...

  4. 吴恩达机器学习笔记 —— 10 神经网络参数的反向传播算法

    http://www.cnblogs.com/xing901022/p/9350271.html 本篇讲述了神经网络的误差反向传播以及训练一个神经网络模型的流程 更多内容参考 机器学习&深度学 ...

  5. 吴恩达机器学习中BP神经网络算法公式的详细推导

      Andrew Ng在他的机器学习课程中讲述bp神经网络时,并没有深究这算法背后的推导过程,只是给了我们一个大体的执行步骤,实现了这个算法但却不知道这个算法背后的原理是件很痛苦的事.在看了知乎.cs ...

  6. [吴恩达机器学习笔记]12支持向量机2 SVM的正则化参数和决策间距

    12.支持向量机 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考资料 斯坦福大学 2014 机器学习教程中文笔记 by 黄海广 12.2 大间距的直观理解- Large Margin I ...

  7. 吴恩达机器学习(十七)过拟合、正则化下的代价函数

    文章目录 1.过拟合 2.正则化下的代价函数 1.过拟合   包插线性回归和逻辑回归等的几种学习算法能够有效解决许多问题,但是当它们应用到某些特定的机器学习应用时,会遇到过度拟合的问题,导致它们表现欠 ...

  8. 吴恩达机器学习(九)—— 神经网络:Learning

    吴恩达机器学习系列内容的学习目录→\rightarrow→吴恩达机器学习系列内容汇总. 1. 代价函数 2. 反向传播算法 3. 反向传播算法的直观理解 4. 实现注意:展开参数 5. 梯度下降 6. ...

  9. 吴恩达机器学习(七)—— 神经网络:Representation

    吴恩达机器学习系列内容的学习目录→\rightarrow→吴恩达机器学习系列内容汇总. 1. 非线性假设 2. 神经元和大脑 3. 模型表示I 4. 模型表示II 5. 多类别分类   神经网络最初是 ...

  10. 吴恩达机器学习(十一)—— 应用机器学习的建议

    吴恩达机器学习系列内容的学习目录 → \rightarrow →吴恩达机器学习系列内容汇总. 1. 决定下一步做什么 2. 评估假设函数 3. 模型选择和训练.验证.测试集 4. 诊断偏差和方差 5. ...

最新文章

  1. 反射得到父类的私有字段
  2. pycharm设置控制台的解释器_PyCharm 中文教程 01:运行 Python 的四种方式
  3. mysql os.pid_离线安装Mysql
  4. linux rm 不释放_linux删除文件空间不释放问题解决
  5. System.currentTimeMillis()存在性能问题
  6. django的数据库名字和models.py中类名的对应关系
  7. win 7中修改Hosts方法
  8. 第27课 老狼老狼几点钟 《小学生C++趣味编程》
  9. 企业无线网演进 2.4GHz或被5GHz频段取代
  10. 项目实体类报错_分享elasticserch在质检算法项目中的应用
  11. 斜率优化dp学习笔记
  12. LeetCode-Sum Root to Leaf Numbers
  13. h3c s5500 ssh v5 配置_H3C S5500 V2基本配置及配置命令
  14. 计算机管理员没有权限删除,答疑:没有管理员权限,无法删除文件?-删除文件...
  15. 计算机无限开机,电脑开机无限循环重启
  16. 【Spring Cloud 基础设施搭建系列】Spring Cloud Demo项目 整合Spring Data JPA
  17. 修复DialogFragment Fragment already added 异常
  18. 玩转docker之mysql容器(常见问题汇总-续更)
  19. 读取文件并输出,输出时将小写字母转为大写
  20. 华为光猫HG8240的简单配置过程

热门文章

  1. 博客园的博客中插入公式
  2. 使用yield返回IEnumberT集合
  3. 新手 Spring 疑惑
  4. svn的使用总结(待补充)
  5. 测试思想-验收测试 关于验收测试
  6. photoshop常用快捷键大全
  7. 第一模块:开发基础 第1章·Python基础语法
  8. 20162312 2016-2017-2《Java程序设计》课程总结
  9. 《java入门第一季》之类面试题
  10. Redis Lock