ufldl学习笔记与编程作业:Multi-Layer Neural Network(多层神经网络+识别手写体编程)...

ufldl学习笔记与编程作业:Multi-Layer Neural Network(多层神经网络+识别手写体编程)


ufldl出了新教程,感觉比之前的好,从基础讲起,系统清晰,又有编程实践。

在deep learning高质量群里面听一些前辈说,不必深究其它机器学习的算法,能够直接来学dl。

于是近期就開始搞这个了。教程加上matlab编程。就是完美啊。

新教程的地址是:http://ufldl.stanford.edu/tutorial/


本节学习地址:http://ufldl.stanford.edu/tutorial/supervised/MultiLayerNeuralNetworks/


神经网络一般求解过程:

1 正向传播,把每一层的激活值求出来,还有总的cost。

  基本上,隐藏层的激活值都是加权和再加上bias,再激活函数比方sigmoid。

  输出层的激活值,或许不叫激活值,叫特征值更好。以softmax为例,是将上一层的激活值作为特征输入X。将权重W作为theta參数,依据公式算出h。

2 反向传播。

先计算输出层的残差。这个能够依据损失函数直接求导。

由l+1层的残差和l层的激活值,就可以求得l层的W和b的梯度。

由l+1层的残差和l层的W,还有l层激活函数的偏导数,就可以求得l层的残差。

4 更新參数W和b

5 增加权重衰减项防止过拟合。求cost和梯度的时候。须要做对应的调整。


以下是supervised_dnn_cost.m的代码:

function [ cost, grad, pred_prob] = supervised_dnn_cost( theta, ei, data, labels, pred_only)
%SPNETCOSTSLAVE Slave cost function for simple phone net
%   Does all the work of cost / gradient computation
%   Returns cost broken into cross-entropy, weight norm, and prox reg
%        components (ceCost, wCost, pCost)%% default values
po = false;
if exist('pred_only','var')po = pred_only;
end;%% reshape into network
numHidden = numel(ei.layer_sizes) - 1;
numSamples = size(data, 2);
hAct = cell(numHidden+1, 1);
gradStack = cell(numHidden+1, 1);
stack = params2stack(theta, ei);%% forward prop
%%% YOUR CODE HERE %%%
for l=1:numHidden   %隐藏层特征计算if(l == 1)z = stack{l}.W*data;else z = stack{l}.W*hAct{l-1};endz = bsxfun(@plus,z,stack{l}.b);hAct{l}=sigmoid(z);
end%输出层(softmax)特征计算
h = (stack{numHidden+1}.W)*hAct{numHidden};
h = bsxfun(@plus,h,stack{numHidden+1}.b);
e = exp(h);
pred_prob = bsxfun(@rdivide,e,sum(e,1)); %概率表
hAct{numHidden+1} = pred_prob;
%[~,pred_labels] = max(pred_prob, [], 1);%% return here if only predictions desired.
if pocost = -1; ceCost = -1; wCost = -1; numCorrect = -1;grad = [];return;
end;%% compute cost 输出层softmax的cost
%%% YOUR CODE HERE %%%
ceCost =0;
c= log(pred_prob);
%fprintf("%d,%d\n",size(labels,1),size(labels,2)); %60000,1
I=sub2ind(size(c), labels', 1:size(c,2));%找出矩阵c的线性索引,行由labels指定,列由1:size(c,2)指定,生成线性索引返回给I
values = c(I);
ceCost = -sum(values);%% compute gradients using backpropagation
%%% YOUR CODE HERE %%%
% Cross entroy gradient%d = full(sparse(labels,1:size(c,2),1));    
d = zeros(size(pred_prob));
d(I) = 1;
error = (pred_prob-d); %输出层的残差 %梯度。残差反向传播
for l = numHidden+1: -1 : 1	gradStack{l}.b = sum(error,2);if(l == 1)gradStack{l}.W = error*data';break;%l==1时。即当前层是第一层隐藏层时,不须要再传播残差else gradStack{l}.W = error*hAct{l-1}';enderror = (stack{l}.W)'*error .*hAct{l-1}.* (1-hAct{l-1});%后面部分是激活函数偏导数
end%% compute weight penalty cost and gradient for non-bias terms
%%% YOUR CODE HERE %%%wCost = 0;
for l = 1:numHidden+1wCost = wCost + .5 * ei.lambda * sum(stack{l}.W(:) .^ 2);%全部权值的平方和
endcost = ceCost + wCost;% Computing the gradient of the weight decay.
for l = numHidden : -1 : 1gradStack{l}.W = gradStack{l}.W + ei.lambda * stack{l}.W;%softmax没用到权重衰减项
end%% reshape gradients into vector
[grad] = stack2params(gradStack);
end


原来训练集是60000条,有点费时间,我改了run_train.m代码,把训练集改了10000条。

当然影响了精确度。



恢复源码,拿60000条做训练集。结果例如以下:




本文作者:linger

本文链接:http://blog.csdn.net/lingerlanlan/article/details/38464317



转载于:https://www.cnblogs.com/lytwajue/p/6771119.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/468757.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sql查询无结果返回空_3分钟短文 | Laravel 查询结果检查是不是空,5个方法你别用错...

引言Laravel 提供了 Eloquent ORM 对象用于操作数据库,将其进行抽象方便操作。因为设计的灵活度,大家在使用Model查询数据集的时候,会面临结果为空,记录不存在的问题, 那么如何有效地判断查询记录为空呢?本…

Android 7.1 bootchart触发后导致不断重启

android7.1 bootchart android 7.1的bootchart问题比较多,之前的版本还是比较稳定的,但是7.1之后出现了问题。 由於7.0 bootchart.cpp中有bug, google在7.1上還沒有修复,当我们执行下面的命令后 adb shell echo 120 > /data/bootchart/st…

深度优先搜索小结

深度优先搜索(DFS) 深度优先搜索就好比走迷宫, 不断顺着一条路走, 直到走不通为止, 然后回退到上一个路口再向另外的方向行走(走过的方向就不会再走了,又不是傻子, 知道走不通,还向走不通的方向走), 不断重复(试过所有路口, 状态转移), 重复直到找到唯一的一条合适的路径; DFS…

python 串口_如何使用Python开发串口通讯上位机(一)

用Python开发串口通讯型上位机,其实并非最优解,本系列更新只为个人学习与总结。如果有C语言底子,嵌入式层面的上位机开发,C Builder,C#才是更加好用的利器。1什么是上位机从事过嵌入式软件开发或者工控机开发的&#x…

[RK3399 Android7.1] 开启保存上一次重启前日志

保存上一次重启前日志的必要 分析死机的情况需要我们把上一次不能及时抓取的日志拿到是非常关键的&#xff0c;这个方法非常有利于我们分析内核panic和Android 死机的情况。 开启的方法 内核配置 在dts文件里面添加下面两个节点 ramoops_mem: ramoops_mem { reg <0x0 …

算法题之求二叉树的最大距离

二叉树是一种非常经典的数据结构。如果我们把二叉树看成一个图&#xff0c;父子节点之间的连线看成是双向的&#xff0c;我们姑且定义"距离"为两节点之间边的个数。写一个程序求一棵二叉树中相距最远的两个节点之间的距离。 下面我们随意构造出一棵二叉树&#xff0c…

MySQL基本操作指令

MySQL 注: MySQL对大小写不敏感, 需要对大小检索, 使用关键字binary, "[]"中内容为可选内容; table_name, tableName表示表名, columnName表示列名, DataType表示表中列数据类型, 粗体部分表示关键字 创建数据库: create database [if not exits] 数据库名;删除数据…

php 公众号验证回调方法_微信公众号关键词自动回复设置方法!

什么是公众号关键词自动回复&#xff1f;在微信公众号平台设置关键词自动回复&#xff0c;可以通过添加规则&#xff0c;关注/订阅的用户发送的消息内容如果是你设置的关键字&#xff0c;即可以实现自动回复预先设置好的内容。关键字自动回复设置方法&#xff1a;1、 首先我们进…

图文|Android 使用Thread 和多线程使用互斥锁

为什么需要多线程进行开发&#xff1f;多线程不管是嵌入式系统RTOS&#xff0c;Linux&#xff0c;还是应用开发&#xff0c;中间件开发&#xff0c;都是必不可少的&#xff0c;做一个技术的时候&#xff0c;如果能做到举一反三&#xff0c;下次使用的时候不会再遇到坑&#xff…

01.轮播图之三 : collectionView 轮播

个人觉得 collection view 做轮播是最方便的&#xff0c;设置下flowlayout 其他不会有很大的变动&#xff0c;没有什么逻辑的代码 lets begin…… 创建自定义的view .h 声明文件 interface CollectionViewShuffling : UIViewproperty (nonatomic,strong)NSArray *array;end .m …

JDBC入门级操作

JDBC:数据库连接, 通过接口实现不同数据库之间的切换, 面向接口编程 JDBC驱动程序将JDBC调用映射成特定的数据库调用 驱动类型: 1.JDBC驱动:JDBC-ODBC桥,最早的实现方式,将JDBC API映射到ODBC API,Java8中已删除 2.直接将JDBC API映射成数据库特定的客户端API,次驱动包含特定数…

手机调试python的软件_Appium+Python(ios真机移动端App H5混合自动化实战测试)

一、环境搭建篇(一)安装JDK大家自行安装(二)安装Appium1、appium desktop2、appium server> brew install node # get node.js> npm install -g appium # get appium> npm install wd # get appium client> appium & # start appium> node your-appium-test…

计算机专业的学生该选择日后的人生道路?继续从事IT还是考公务员……

问题来自知乎原问题如下&#xff1a;知乎上的盆友们大家好&#xff01;我是某高校大二学生。万能的知友们&#xff0c;有相关经验的大家给点宝贵意见呗&#xff0c;万分感谢。个人问题&#xff1a;我当时是听说这一行工资高&#xff0c;因为家里条件一般&#xff0c;所以想要挣…

file_put_contents()写入数组

file_put_contents()写入数组 $arr array(name>张三&#xff0c;‘age’>26, sex>男 ) $str var_export($arr,TRUE); file_put_contents($filename,$str);转载于:https://www.cnblogs.com/icefei/p/6773916.html

JVM垃圾收集器与内存分配策略学习总结

方法区: 1.线程共享 2.储存类信息,常量,静态变量,编译器编译后的代码 3.非堆(别名)用于区分Java堆 4.不需要连续的内存 5.可以固定或可扩张 6.选择不实现垃圾回收//这个区域很少进行垃圾回收 7.针对常量池回收 8.对类型的卸载 9.无法满足内存分配需求抛出OutOfMemoryError4 虚…

汇编比较两个数大小_计算机是怎样跑起来的 -- 体验一次汇编过程

标志内存或I/O中存储单元的数字叫做“地址”。CPU中的标志寄存器有什么作用&#xff1f;用于在运算指令执行后&#xff0c;存储运算结果的某些状态。从程序员的角度看硬件CPU&#xff1a;种类&#xff0c;时钟信号的频率。可以使用哪种机器语言取决于CPU的种类。内存信息&#…

Nginx 作为 WebSockets 代理

WebSocket 协议给我们提供了一个创建可以支持客户端和服务端进行双向实时通信的web应用程序的方法。相比之前使用的方法&#xff0c;WebSocket&#xff08;作为HTML5的一部分&#xff09;可以使我们更容易开的发出这种类型的应用程序。绝大多数的现代浏览器都支持WebSocket&…

设计模式小结

开始的毛病:变量命名不规范,if-else判断有的代码做无用功,代码健壮性太差,没有做try-cath异常处理 工厂模式(创建型模式): 创建对象接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建延伸到子类进行 主要解决接口选择问题,明确计划不同条件下执行创建不同实例 通过子…

android区块链 钱包_区块链钱包Cashbox 开发工程师聊一聊开源

今天与大家聊一聊软件开源。事情的起因是一次闲谈的时候&#xff0c;市场部的同事表示&#xff1a;不做软件开发的人不能够理解为什么要把软件源代码公开出去。当时的我很惊讶&#xff0c;因为就像他们不理解为什么要开源一样&#xff0c;我也不理解他们为什么不理解为什么要开…

dom4j创建、解析xml文件(增删改查)

先对xml文件进行解析,xml文件如下图所示 <?xml version"1.0" encoding"UTF-8"?><?eclipse version"3.4"?> <student1> <studentID>001</studentID> <name>sanny</name> <major>…