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};
end
z = 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 po
cost = -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}';
end
error = (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+1
wCost = wCost + .5 * ei.lambda * sum(stack{l}.W(:) .^ 2);%全部权值的平方和
end cost = ceCost + wCost; % Computing the gradient of the weight decay.
for l = numHidden : -1 : 1
gradStack{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

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

  1. ufldl学习笔记和编程作业:Feature Extraction Using Convolution,Pooling(卷积和汇集特征提取)

    ufldl学习笔记与编程作业:Feature Extraction Using Convolution,Pooling(卷积和池化抽取特征) ufldl出了新教程,感觉比之前的好,从基础讲起.系统清晰 ...

  2. ufldl学习笔记和编程作业:Softmax Regression(softmax回报)

    ufldl学习笔记与编程作业:Softmax Regression(softmax回归) ufldl出了新教程.感觉比之前的好,从基础讲起.系统清晰,又有编程实践. 在deep learning高质量 ...

  3. ufldl学习笔记与编程作业:Softmax Regression(vectorization加速)

    ufldl学习笔记与编程作业:Softmax Regression(vectorization加速) ufldl出了新教程,感觉比之前的好.从基础讲起.系统清晰,又有编程实践. 在deep learn ...

  4. ufldl学习笔记与编程作业:Logistic Regression(逻辑回归)

    ufldl学习笔记与编程作业:Logistic Regression(逻辑回归) ufldl出了新教程,感觉比之前的好,从基础讲起.系统清晰,又有编程实践. 在deep learning高质量群里面听 ...

  5. ufldl学习笔记与编程作业:Linear Regression(线性回归)

    ufldl学习笔记与编程作业:Linear Regression(线性回归) ufldl出了新教程,感觉比之前的好.从基础讲起.系统清晰,又有编程实践. 在deep learning高质量群里面听一些 ...

  6. stanford coursera 机器学习编程作业 exercise4--使用BP算法训练神经网络以识别阿拉伯数字(0-9)

    在这篇文章中,会实现一个BP(backpropagation)算法,并将之应用到手写的阿拉伯数字(0-9)的自动识别上. 训练数据集(training set)如下:一共有5000个训练实例(trai ...

  7. 深度学习课程笔记(十六)Recursive Neural Network

    深度学习课程笔记(十六)Recursive Neural Network  2018-08-07 22:47:14 This video tutorial is adopted from: Youtu ...

  8. 深度学习课程笔记(十五)Recurrent Neural Network

    深度学习课程笔记(十五)Recurrent Neural Network 2018-08-07 18:55:12 This video tutorial can be found from: Yout ...

  9. 【论文笔记】Malware Detection with Deep Neural Network Using Process Behavior

    [论文笔记]Malware Detection with Deep Neural Network Using Process Behavior 论文基本信息 会议: IEEE(2016 IEEE 40 ...

随机推荐

  1. java阶乘问题

    问题描述: 编写代码求:1!+2!+3!+…+20!的值 代码 public class Demo { public static void main(String[] args) { long nu ...

  2. GridControl事件

    private void gridView1_RowCellClick(object sender, DevExpress.XtraGrid.Views.Grid.RowCellClickEventA ...

  3. 微软浏览器兼容工具modern.IE

    http://www.browserstack.com/screenshots

  4. GitHub 上100个最受欢迎的Java基础类库

    作为一名整天与既成熟且不断发展的Java语言打交道的开发者,面对的困境之一就是在我们编写代码的时候,是使用一些人人谈论的人们新技术呢,还是坚持使用一些虽旧但成熟的类库? 由于Java应用中大部分是商业 ...

  5. Unity3d通用工具类之解压缩文件

    今天,我们来写写c#是如何通过代码解压缩文件的. 在游戏的项目中呢,常常我们需要运用到解压缩的技术.比如,当游戏需要更新的时候,我们会从服务器中下载更新的压缩文件包. 这时候我们就需要解压文件,然后覆 ...

  6. Android Parcel对象详解

    关于Parcel的使用 在分析Parcel之前,首先按照分析流程,介绍下关于Parcel的相关常规使用. 首先是关于Parcel的获取: Parcel parcle = Parcel.Obtain() ...

  7. Dockerfile减少构建镜像大小的方法

    这几天基于Dockerfile构建应用需要的特殊的镜像,比如Nginx需要add很多module的,就需要在镜像内编译和做build. 通过Dockerfile构建镜像时,很容易把镜像构建得很大. 从 ...

  8. lykchat信息发送系统

    lykchat信息发送系统是Python3开发的,通过模拟微信网页端,基于个人微信号,为系统管理人员提供信息发送工具. 实现的功能有用户登录管理.微信登陆管理和微信信息发送功能. 代码地址:https ...

  9. websocket+golang聊天室

    原文地址: http://www.niu12.com/article/3 websocket+golang聊天室 main.go和index.html放在同一目录下 main.go package m ...

  10. 十.spring-boot添加jsp支持

    1.创建maven web project: 2.在添加web依赖 3.配置application.properties支持jsp 4.添加一个controller类 5.加入jsp页面 6.启动类 ...