隐含层,指除输入、输出层外,的中间层。输入、输出层对外可见。隐含层对外不可见。理论上,只要隐含层节点足够多,只有一个隐含层,神经网络可以拟合任意函数。隐含层越多,越容易拟合复杂函数。拟合复杂函数,所需隐含节点数,随隐含层数量增多指数下降。

过拟合,模型预测准确率在训练集上升,在测试集下降。泛化性不好,模型记忆当前数据特征,不具备推广能力。参数太多。Hinton教授团队,Dropout。随便丢弃部分输出数据节点。创造新随机样本,增大样本量,减少特征数量,防止过拟合。bagging方法,对特征新种采样。

SGD参数难调试,SGD设置不同学习速率,结果可能差异巨大。神经网络很多局部最优解可以达到比较好分类效果,全局最优反而容易过拟合。Adagrad、Adam、Adadelta自适应方法,减轻调试参数负担。SGD需要调试学习速率、Momentum、Nesterov参数。

梯度弥散(Gradient Vanishment)。Sigmoid函数具有限制性,输出数值在0〜1,最符合概率输出定义。非线性Sigmoid函数,信号特征空间映射,中央区信号增益大,两侧区信息增益小。中央区像神经元兴奋态,两侧区像神经元抑制态。训练时,重要特征放中央区,非重要特征放两侧区。Sigmoid比最初期线性激活函数y=x,阶梯激活函数y=-1(x<0)|y=1(x>=0)、y=0(x<0)|y=1(x>=0)好。Sigmoid函数反向传播梯度值在多层传递指级急剧减小,根据训练数据反馈更新神经网络参数非常缓慢,不起训练作用。

ReLU,非线性函数y=max(0,x),坐标轴上折线,当x<=0,y=0,x>0,y=x。人脑阈值响应机制,信号超过某个阈值,神经元兴奋激活状态,平时抑制状态。ReLU很好传递梯度,多层反向传播,梯度不会大幅缩小,适合很深神经网络,不需要无监督逐层初始化权重。ReLU变化,单侧抑制,相对宽阁兴奋边界,稀疏激活性。神经元同时激活1~4%,选择性响应很少部分输入信号,屏蔽大量不相关信号,更高效提取重要特征。传统Sigmoid函数接近一半神经元被激活。Softplus,单侧抑制,没有稀疏激活性。ReLU及变种(EIU,PReLU,RReLU)为最注流激活函数。输出层一般用Sigmoid函数,最接近概率输出分布。

隐含层可以解决XOR问题,用曲线划分两类样本。隐含层越多,原有特征越抽象变换。是多层神经网络(多层感知机 MLP)功能。

网络神经加上隐含层,使用Dropout、自适应学习速率Adagrad,解决梯度弥散激活函数ReLU。

载入TensorFlow,加载MNIST数据集,创建Interactive Session。

隐含层参数设置Variable初始化。in_units输入节点数,h1_units隐含层输出节点数设300(200〜1000区别不大)。W1隐含层权重初始化截断正态分布标准差0.1,b1偏置设0。模型激活函数ReLU,正态分布给参数加噪声,打破完全对称避免0梯度。偏置赋小非零值避免dead neuron(死亡神经元)。最后输出层Softmax,权重W2偏置b2初始化0。Sigmoid,0附近最敏感,梯度最大。

训练和预测,Dropout比率keep_prob(保留节点概率)不同。训练小于1。预测等于1。Dropout比率为计算图输入,定义placeholder。

定义模型结构。tf.nn.relu(tf.matmul(x,W1+b1)),实现激活函数为ReLU的hidden1隐含层,y=relu(W1x+b1)。tf.nn.dropout实现Dropout,随机置0分部节点。keep_prob参数,保留数据不置为0比例,训练应小于1,制造随机性,防止过拟合,预测等于1,用全部特征预测样本类别。输出层Softmax。

定义算法公式,神经网络forward计算。定义损失函数(交叉信息熵)和选择优化器(自适应优化器Adagrad),优化loss,学习速率0.3,使用tf.train.AdagradOptimizer 。Adadelta、Adam优化器。

训练,keep_prob计算图输入,训练时设0.75,保留75%节点,其余25%置0。越复杂越大规模神经网络,Dropout效果越显著。隐含层,需要更多训练迭代优化模型参数。3000个bacth,每个bacth100条样本,30万样本。相当全数据集5轮epoch迭代。增大循环次数,准确率略有提高。

准确率评测,加入keep_prob输入,等于1。

没有隐含层Softmax Regression,直接从图像像素推断是哪个数字,没有特征抽象过程。多层神经网络隐含层,组合高阶特征或组件,再组合成数字,实现精准匹配分类。隐含层输出高阶特征组件可以复用,每一类判别、概率输出共享。

全连接神经网络(Fully Connected Network,FCN,MLP的另一种说法)局限,很深网络,很多隐藏节点,很大迭代轮数,也难达到99%以上准确率。

  1. # Create the model
  2. from tensorflow.examples.tutorials.mnist import input_data
  3. import tensorflow as tf
  4. mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
  5. sess = tf.InteractiveSession()
  6. in_units = 784
  7. h1_units = 300
  8. W1 = tf.Variable(tf.truncated_normal([in_units, h1_units], stddev=0.1))
  9. b1 = tf.Variable(tf.zeros([h1_units]))
  10. W2 = tf.Variable(tf.zeros([h1_units, 10]))
  11. b2 = tf.Variable(tf.zeros([10]))
  12. x = tf.placeholder(tf.float32, [None, in_units])
  13. keep_prob = tf.placeholder(tf.float32)
  14. hidden1 = tf.nn.relu(tf.matmul(x, W1) + b1)
  15. hidden1_drop = tf.nn.dropout(hidden1, keep_prob)
  16. y = tf.nn.softmax(tf.matmul(hidden1_drop, W2) + b2)
  17. # Define loss and optimizer
  18. y_ = tf.placeholder(tf.float32, [None, 10])
  19. cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))
  20. train_step = tf.train.AdagradOptimizer(0.3).minimize(cross_entropy)
  21. # Train
  22. tf.global_variables_initializer().run()
  23. for i in range(3000):
  24. batch_xs, batch_ys = mnist.train.next_batch(100)
  25. train_step.run({x: batch_xs, y_: batch_ys, keep_prob: 0.75})
  26. # Test trained model
  27. correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
  28. accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
  29. print(accuracy.eval({x: mnist.test.images, y_: mnist.test.labels, keep_prob: 1.0}))

参考资料:
《TensorFlow实战》

欢迎付费咨询(150元每小时),我的微信:qingxingfengzi

学习笔记TF026:多层感知机的更多相关文章

  1. thinkphp学习笔记7—多层MVC

    原文:thinkphp学习笔记7-多层MVC ThinkPHP支持多层设计. 1.模型层Model 使用多层目录结构和命名规范来设计多层的model,例如在项目设计中如果需要区分数据层,逻辑层,服务层 ...

  2. 『TensorFlow』读书笔记_多层感知机

    多层感知机 输入->线性变换->Relu激活->线性变换->Softmax分类 多层感知机将mnist的结果提升到了98%左右的水平 知识点 过拟合:采用dropout解决,本 ...

  3. webdriver(python)学习笔记七——多层框架定位与智能等待

    多层框架或窗口定位: switch_to_frame() switch_to_window() 智能等待: implicitly_wait() 现在web应用中经常会遇到框架如(frame)或窗口(w ...

  4. 学习笔记TF011:多层神经网络

    线性回归.对数几率回归模型,本质上是单个神经元.计算输入特征加权和.偏置视为每个样本输入特征为1权重,计算特征线性组合.激活(传递)函数 计算输出.线性回归,恒等式(值不变).对数几率回归,sigmo ...

  5. Machine Learning 02 学习笔记 卷积、感知机、神经网络

    理解卷积公式. 卷积的物理意义. 图像的卷积操作. 卷积神经网络. 卷积的三层含义. 感知机. 感知机的缺陷. 总结. 神经网络. 缺陷. 激活函数

  6. TensorFlow学习笔记7-深度前馈网络(多层感知机)

    深度前馈网络(前馈神经网络,多层感知机) 神经网络基本概念 前馈神经网络在模型输出和模型本身之间没有反馈连接;前馈神经网络包含反馈连接时,称为循环神经网络. 前馈神经网络用有向无环图表示. 设三个函数 ...

  7. tensorflow学习笔记——自编码器及多层感知器

    1,自编码器简介 传统机器学习任务很大程度上依赖于好的特征工程,比如对数值型,日期时间型,种类型等特征的提取.特征工程往往是非常耗时耗力的,在图像,语音和视频中提取到有效的特征就更难了,工程师必须在这 ...

  8. DeepLearning学习(1)--多层感知机

    想直接学习卷积神经网络,结果发现因为神经网络的基础较弱,学习起来比较困难,所以准备一步步学.并记录下来,其中会有很多摘抄. (一)什么是多层感知器和反向传播 1,单个神经元 神经网络的基本单元就是神经 ...

  9. (数据科学学习手札44)在Keras中训练多层感知机

    一.简介 Keras是有着自主的一套前端控制语法,后端基于tensorflow和theano的深度学习框架,因为其搭建神经网络简单快捷明了的语法风格,可以帮助使用者更快捷的搭建自己的神经网络,堪称深度 ...

随机推荐

  1. JAVAEE学习——struts2_01:简介、搭建、架构、配置、action类详解和练习:客户列表

    一.struts2是什么 1.概念 2.struts2使用优势以及历史 二.搭建struts2框架 1.导包 (解压缩)struts2-blank.war就会看到 2.书写Action类 public ...

  2. (转)Javascript的DOM操作 - 性能优化

    转载:https://my.oschina.net/blogshi/blog/198910 摘要: 想稍微系统的说说对于DOM的操作,把Javascript和jQuery常用操作DOM的内容归纳成思维 ...

  3. ActiveMQ 和消息简介

    Apache ActiveMQ 是远程系统间进行通信的消息代理,实现了 JMS(Java Message Service,Java 消息服务).尽管 ActiveMQ 是使用 Java 写的,但是其提 ...

  4. Unity3D 骨骼动画原理学习笔记

    最近研究了一下游戏中模型的骨骼动画的原理,做一个学习笔记,便于大家共同学习探讨. ps:最近改bug改的要死要活,博客写的吭哧吭哧的~ 首先列出学习参考的前人的文章,本文较多的参考了其中的表述: 1. ...

  5. WPF Dashboard仪表盘控件的实现

    1.确定控件应该继承的基类 从表面上看,目前WPF自带常用控件中,没有一个是接近这个表盘控件的,但将该控件拆分就能够发现,该控件的每个子部分都是在WPF中存在的,因此我们需要将各个子控件组合才能形成这 ...

  6. 对jsp的初步了解及规范问题(二)

    前言 今天的例子是用jsp制作简单的“艾宾浩斯记忆曲线的学习计划表”. 重点不是算法,重点是学习jsp中的一个重要的思想,作为展现层,jsp中不应该出现业务逻辑代码. 当中<%%>代码也会 ...

  7. STL的空间配置器std_alloc 笔记

    STL的空间配置器std_alloc 笔记 C++的内存分配基本操作是 ::operator new(),内存释放是 ::operator delete(),这里个全局函数相当于C的malloc和fr ...

  8. Bash的条件表达式求值

    Bash的条件控制允许两种类型:1)命令的成功或失败 2)逻辑表达式的真假这两种类型都可以通过退出状态($?)来检验,$?=0为真,否则为假 一.命令的成功或失败 通过查看$?值$echo $? 二. ...

  9. IPhone开发“此证书是由未知颁发机构签名”解决办法

    有一种情况是你删除了钥匙串中的系统文件,只要重新下载,并双击(会自动添加到钥匙串中)就ok了. 从浏览器中直接敲入下载地址:http://developer.apple.com/certificati ...

  10. java 字符串全排列 和 去重

    用递归进行排序 , 用TreeSet 去重. public class test { public static void main(String []args){ String str = &quo ...