MLP(多层神经网络)介绍
写在前面的
接触神经网络(ANN)的时间很长了,以前也只是学了学原理,做过一个BPN的练习,没有系统的总结过,最近看Torch的源码,对MLP有了更多的了解,写写自己学到的东西吧,算是做了一次总结!
ANN的特点
(1) 高度的并行性
人工神经网络是由许多相同的简单处理单元并联组合而成,虽然每个单元的功能简单,但大量简单单元的并行活动,使其对信息的处理能力与效果惊人。
(2) 高度的非线性全局作用
神经网络系统是由大量简单神经元构成的,每个神经元接受大量其他神经元的输入,通过非线性输入、输出关系,产生输出影响其它神经元。网络就是这样互相制约相互影响,实现从输入状态空间到输出状态空间非线性映射的。网络的演化遵从全局性作用原则,从输入状态演化到终态而输出。从全局观点来看,网络整体性能不是网络局部性能的简单迭加,而表现某种集体性行为;而电脑遵从串行式局域性操作原则,每一步计算与上一步计算紧密相关,并对下一步产生影响,问题是通过算法逐步进行处理的。
(3) 良好的容错性与联想记忆功能
人工神经网络通过自身的网络结构能够实现对信息的记忆,而所记忆的信息是存储在神经元之间的权值中。从单个权值中看不出所储存的信息内容,因而是分布式的存储方式。这使得网络具有良好的容错性,并能进行聚类分析、特征提取、缺损模式复原等模式信息处理工作。
十分强的自适应、自学习功能人工神经网络可以通过训练和学习来获得网络的权值与结构,呈现出很强的自学习能力和对环境的自适应能力。
ANN分类
BPN(Back Propagation Net)
在这里我介绍一下反向传播网络BPN---带动量项的误差反传。反向传播神经网络是对非线性可微分函数进行权值训练的多层网络,是前向神经网络的一种。BP网络主要用于:
1)函数逼近与预测分析:用输入矢量和相应的输出矢量训练一个网络,逼近一个函数或预测未知信息;
2)模式识别:用一个特定的输出矢量将它与输入矢量联系起来;
3)分类:把输入矢量以所定义的合适方式进行分类;
4)数据压缩:减少输出矢量维数以便于传输与存储。
比如,一个三层BPN结构如下:
由输入层、隐含层和输出层三层组成。其中每一层的单元与与之相邻层的所有单元连接,同一层的单元之间没有连接。当一对学习样本提供给网络后,神经元的激活值从输入层经各中间层向输出层传播,在输出层的各神经元获得网络的输入响应。接下来,按照减少目标输出与实际误差的方向,从输出层经过各中间层逐层修正各连接权值,最后回到输入层。
感知器(Perception)类型
linear----线性感知器
tanh----双曲正切函数
sigmoid----双曲函数
softmax----1/(e(net) * e(wi*xi- shift))
log-softmax---- log(1/(e(net) * e(wi*xi)))
exp----指数函数
softplus----log(1+ e(wi*xi))
梯度下降
Delta学习方法
增量梯度下降
MLP的缺陷
1.网络的隐含节点个数选取问题至今仍是一个 世界难题(Google, Elsevier, CNKI);
2.停止阈值、学习率、动量常数需要采用”trial-and-error”法,极其耗时(动手实验);
3.学习速度慢;
4.容易陷入局部极值,学习不够充分。
应用举例
- static void Main(string[] args)
- {
- int row = 2;//训练样例的数目
- int n_in = 2;//输入值的个数
- int n_out = 1;//输出值的个数
- int n_hidden = 1;//隐含层单元个个数
- double eta = 0.3;//学习速率
- double alfa = 0.9;//动量项
- int [,] t_ex = new int[row,n_in + n_out];//训练样例
- //赋初值 训练样例
- t_ex[0, 0] = 1;
- t_ex[0, 1] = 0;
- t_ex[0, 2] = 1;
- t_ex[1, 0] = 0;
- t_ex[1, 1] = 1;
- t_ex[1, 2] = 0;
- double[] Delta_Out = new double[n_out];//输出单元误差
- double[] Delta_Hidden = new double[n_hidden];//隐藏单元误差
- double[] O_Out = new double[n_out];//输出单元的输出
- double[] O_Hidden = new double[n_hidden];//隐含单元的输出
- double[,] W_Out = new double[n_out,n_hidden + 1];//输出单元的权值
- double[,] W_Hidden = new double[n_hidden,n_in + 1];//隐含单元的权值
- double[,] Delta_W_Out = new double[n_out,n_hidden + 1];//输出单元的权值差
- double[,] Delta_W_Hidden = new double[n_hidden,n_in + 1];//隐含单元的权值差
- //初始化所有网络权值为0.1
- for (int i = 0; i < n_out;i++ )
- {
- for (int j = 0;j < n_hidden + 1;j++)
- {
- W_Out[i,j] = 0.1;
- Delta_W_Out[i,j] = 0;
- }
- }
- for (int i = 0; i < n_hidden; i++)
- {
- for (int j = 0; j < n_in + 1;j++ )
- {
- W_Hidden[i,j] = 0.1;
- Delta_W_Hidden[i,j] = 0;
- }
- }
- //迭代进行训练
- bool over = true;
- int itera_time = 0;//迭代次数
- while (over)
- {
- //进行训练
- for (int i = 0; i < row;i++ )
- {
- //计算隐含层单元的输出
- double net = 0;
- for (int j = 0; j < n_hidden; j++)
- {
- net = W_Hidden[j, 0];
- //计算输出值
- for (int r = 1; r < n_in + 1; r++)
- {
- net += W_Hidden[j, r] * t_ex[i, r - 1];
- }
- O_Hidden[j] = 1.0 / (1 + Math.Exp(-net));
- }
- //计算输出层单元的输出
- for (int j = 0; j < n_out;j++ )
- {
- net = W_Out[j,0];
- for (int r = 1; r < n_hidden + 1;r++ )
- {
- net += W_Out[j,r] * O_Hidden[r - 1];
- }
- O_Out[j] = 1.0 / (1 + Math.Exp(-net));
- }
- //计算输出层单元的误差项
- for (int j = 0; j < n_out;j++ )
- {
- Delta_Out[j] = O_Out[j] * (1 - O_Out[j]) * (t_ex[i,n_in + j] - O_Out[j]);
- }
- //计算隐含层单元的误差项
- for (int j = 0;j < n_hidden;j++)
- {
- double sum_weight = 0;
- for (int k = 0;k < n_out;k++)
- {
- for (int h = 0;h < n_hidden + 1;h++)
- {
- sum_weight += Delta_Out[k] * W_Out[k,h];
- }
- }
- Delta_Hidden[j] = O_Hidden[j] * (1 - O_Hidden[j]) * sum_weight;
- }
- //更新每个网络单元的权值
- //更新输出层的权值
- for (int j = 0;j < n_out;j++)
- {
- Delta_W_Out[j, 0] = eta * Delta_Out[j] + alfa * Delta_W_Out[j, 0];
- W_Out[j, 0] = W_Out[j, 0] + Delta_W_Out[j, 0];
- for (int k = 1; k < n_hidden + 1;k++ )
- {
- Delta_W_Out[j, k] = eta * Delta_Out[j] * O_Hidden[k - 1] + alfa * Delta_W_Out[j, k];
- W_Out[j, k] = W_Out[j, k] + Delta_W_Out[j, k];
- }
- }
- //更新隐含层的权值
- for (int j = 0; j < n_hidden; j++)
- {
- Delta_W_Hidden[j, 0] = eta * Delta_Hidden[j] + alfa * Delta_W_Hidden[j, 0];
- W_Hidden[j, 0] = W_Hidden[j, 0] + Delta_W_Hidden[j, 0];
- for (int k = 1; k < n_in + 1;k++ )
- {
- Delta_W_Hidden[j, k] = eta * Delta_Hidden[j] * t_ex[i, k - 1] + alfa * Delta_W_Hidden[j, k];
- W_Hidden[j, k] = W_Hidden[j, k] + Delta_W_Hidden[j, k];
- }
- }
- }
- //训练1000次结束循环
- itera_time++;
- if (itera_time == 1000)over = false;
- }
- //输出训练后的权值
- Console.WriteLine("输出层权值:");
- for (int i = 0; i < n_out; i++)
- {
- for (int j = 0; j < n_hidden + 1;j++ )
- {
- Console.WriteLine(W_Out[i,j]);
- }
- }
- Console.WriteLine("隐含层权值:");
- for (int i = 0; i < n_hidden; i++)
- {
- for (int j = 0; j < n_in + 1;j++ )
- {
- Console.WriteLine(W_Hidden[i,j]);
- }
- }
- }
- }
原文:http://blog.csdn.net/cxf7394373/article/details/6061372
MLP(多层神经网络)介绍的更多相关文章
- 多层神经网络BP算法 原理及推导
首先什么是人工神经网络?简单来说就是将单个感知器作为一个神经网络节点,然后用此类节点组成一个层次网络结构,我们称此网络即为人工神经网络(本人自己的理解).当网络的层次大于等于3层(输入层+隐藏层(大于 ...
- TensorFlow 训练MNIST数据集(2)—— 多层神经网络
在我的上一篇随笔中,采用了单层神经网络来对MNIST进行训练,在测试集中只有约90%的正确率.这次换一种神经网络(多层神经网络)来进行训练和测试. 1.获取MNIST数据 MNIST数据集只要一行代码 ...
- 用Tensorflow实现多层神经网络
用Tensorflow实现多层神经网络 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 Tensorflow机器学习实战指南 源代码请点击下方链接欢迎加星 ReLU激活函数/L1范数 ...
- Spark2.0机器学习系列之7: MLPC(多层神经网络)
Spark2.0 MLPC(多层神经网络分类器)算法概述 MultilayerPerceptronClassifier(MLPC)这是一个基于前馈神经网络的分类器,它是一种在输入层与输出层之间含有一层 ...
- ufldl学习笔记与编程作业:Multi-Layer Neural Network(多层神经网络+识别手写体编程)
ufldl学习笔记与编程作业:Multi-Layer Neural Network(多层神经网络+识别手写体编程) ufldl出了新教程,感觉比之前的好,从基础讲起,系统清晰,又有编程实践. 在dee ...
- MLPclassifier,MLP 多层感知器的的缩写(Multi-layer Perceptron)
先看代码(sklearn的示例代码): from sklearn.neural_network import MLPClassifier X = [[0., 0.], [1., 1.]] y = [0 ...
- (转)LSTM神经网络介绍
原文链接:http://www.atyun.com/16821.html 扩展阅读: https://machinelearningmastery.com/time-series-prediction ...
- YJango的卷积神经网络——介绍
原文地址:https://zhuanlan.zhihu.com/p/27642620 如果要提出一个新的神经网络结构,首先就需要引入像循环神经网络中“时间共享”这样的先验知识,降低学习所需要的训练数据 ...
- 【TensorFlow入门完全指南】神经网络篇·MLP多层感知机
前面的不做过多解释了. 这里定义了两个占位符,各位也知道,在训练时,feed_dict会填充它们. 定义相关网络. 这里是权值矩阵和偏差. 这里是实例化了网络,定义了优化器和损失,和上一篇一样. 最后 ...
随机推荐
- uva748 - Exponentiation 高精度小数的幂运算
uva748 - Exponentiation Exponentiation Problems involving the computation of exact values of very ...
- ORB特征提取与匹配
ORB特征是目前最优秀的特征提取与匹配算法之一,下面具体讲解一下: 特征点的检测 图像的特征点可以简单的理解为图像中比较显著显著的点,如轮廓点,较暗区域中的亮点,较亮区域中的暗点等.ORB采用FAST ...
- TypeScript 变量声明(二)
ES6 中,变量声明一共有6种,分别是var.function .let.const.class和import. let 基本语法:let 变量名 :类型.其中类型不是必须的. 1.用于声明变量,其用 ...
- Linux下RPM包管理
概述 一种用于互联网下载包的打包及安装工具,它包含在某些linux分发版中.它生成具有.RPM扩展名的文件.RPM是Redhat Package Manager(Redhat软件包管理工具)的缩写.这 ...
- LNMP+Zabbix搭建
LNMP+Zabbix搭建 cmake2.8.8,Nginx-1.6.3,Php-5.5.38,Mysql-5.5.32,Zabbix-3.2.6 修改 /etc/selinux/config 文件中 ...
- Access 2010 VBA 读取 表中的数据
Option Compare Database Private Sub Command0_Click() Dim db Dim rs As Recordset Dim str As String Se ...
- FW: Dockerfile RUN, CMD & ENTRYPOINT
Dockerfile RUN, CMD & ENTRYPOINT 在使用Dockerfile创建image时, 有几条指令比较容易混淆, RUN, CMD, ENTRYPOINT. R ...
- Maven 整合SSH框架
1. 传递依赖冲突 1.1 传递依赖:A(项目)依赖B,B依赖C(1.1版本),B是A的直接依赖,C是A的传递依赖; A(项目)又依赖D,D依赖C(1.2版本),此时,C有两个版本,产生冲突; 1.2 ...
- Delphi中MD5实现方法(转)
原来写过一个计算MD5的程序,是用了一个叫MD5.pas的单元,使用起来还算简单,但还有更简单的办法,安装了indy就会有IdHashMessageDigest单元(delphi 7默认安装indy) ...
- 自动更新SVN项目
@echo off@echo =================================@echo 定时在SVN上自动更新项目内容,可用于项目放在web服务器没有hudson的时候@echo ...