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会填充它们. 定义相关网络. 这里是权值矩阵和偏差. 这里是实例化了网络,定义了优化器和损失,和上一篇一样. 最后 ...
随机推荐
- 设置select选中某个option
<select class="selector"></select> 1.设置value为pxx的项选中 $(".selector"). ...
- PrintArea打印,@media screen解决移动web开发的多分辨率问题,@media print设置打印的样式
PrintArea打印,局部DIV打印插件,依赖JQuery. github:https://github.com/RitsC/PrintArea 当打印时需要临时改变页面布局,可以使用 @media ...
- Pycharm 2017 12月最新激活码
激活的办法:这个必须的联网才可以使用(每次打开PyCharm都需要电脑联网才可以正常使用),要是没网的话,就不能激活使用啦,大家注意哈. http://idea.iteblog.com/key.php ...
- 《ASP.NET1200例》C#在网页上编写动态时钟
包含Timer类的命名空间有3个 Timer Class (System.Threading) Timer Class (System.Windows.Forms) 一般用于窗体程序 Timer ...
- cocos2d-X学习之主要类介绍:动作:CCAction
引用自:http://www.cnblogs.com/lhming/archive/2012/07/01/2572238.html 类继承图: 主要函数: virtual CCObject * co ...
- Python SQLAlchemy基本操作和常用技巧(包含大量实例,非常好)
https://www.jb51.net/article/49789.htm 首先说下,由于最新的 0.8 版还是开发版本,因此我使用的是 0.79 版,API 也许会有些不同.因为我是搭配 MySQ ...
- Json对象与Json字符串的转化
1.jQuery插件支持的转换方式: $.parseJSON( jsonstr ); //jQuery.parseJSON(jsonstr),可以将json字符串转换成json对象 2.浏览器支持的转 ...
- app返回之前app焦点的操作方法
var hdWin,hdfocus: THandle; trdID: Cardinal; //获取前置app窗口句柄 hdWin := GetForegroundWindow;//FindWindow ...
- Java 之综合练习
// 练习一: 写出程序结果 interface A{} class B implements A { public String func() { return "func"; ...
- OpenStack Network --- introduction部分 阅读笔记
Basic Networking 1.混杂模式(promiscuous mode):当网卡被配置为混杂模式时,它们会将所有的frame传递给操作系统,即使MAC地址不匹配. 2.交换机(switch) ...