首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

换一种方式过愚人节——别再被Tensorflow愚弄了

哈喽哈喽大家好,这里是大数学极客,我是今天的值班主页菌高三六班牛义义。

上一篇机器学习系列我好像答应了大家要写朴素贝叶斯分类器,但最近事情真是太多了,只能鸽了.....,恰逢这两周入坑神经网络模型和Tensorflow框架,那就先写这方面吧,朴素贝叶斯那件事看心情。

这一篇主要目的是介绍一下全连接神经网络的结构、参数训练原理、评估指标以及tensorflow的实现。

需要的数学基础:会求导…..

需要的编程基础:会简单的使用python…..

好,门槛贼低。下面正式开始。

全连接神经网络结构

全连接神经网络是为了区分于后续著名的卷积神经网络(CNN)、循环神经网络(RNN)等结构而提的,是一种较早提出的、结构被应用广泛的网络。主要思路是模拟人脑对于事物特征的重组、抽象能力。方式是通过将一些零散的特征进行加权线性组合、非线性函数的激活,逐层整合,完成我们期待的监督学习任务。

下面我以两个输入节点,一个神经元的例子来说明全连接神经网络的工作流程。

图1全连接神经网络结构示意图

如图1所示,x1,x2为输入节点,z为隐层神经元,所谓全连接的意思就是,每个输入节点都要和中间的神经元连接,进行线性加权组合运算。即:

然后对上述线性组合进行去线性化激活,目的是解决线性不可分问题,以及使得多层网络更有意义,否则多层网络与一层线性网络将没有区别。激活函数一般有softmax, Relu, tanh.

即:

全连接神经网络参数训练过程

经过一系列的网络学习可以得到模型的输出,如我们在前作《机器并不想学习》中提到的那样,为了使得输出值与真实值尽可能接近,我们构造损失函数,以平方损失函数为例:

那后面又到了最熟悉的路子,找一组w,使得平方损失最小,最粗暴的办法其实也是他们这帮搞机器学习的人信服的办法——梯度下降,什么意思呢。其实就是对w求导,然后让导数为,进而求得极小值点。既然说到求导,又涉及到多元函数,那就是顺着图1,逆着神经网络前向传播反向逐层求导,这个过程称为反向传播算法,翻译成中国话叫复合求导法则。具体过程如下:

通常这个求导链非常复杂,一般很难用解析的办法去求解。在这个基础下,随机梯度下降算法、Adam、动量这些数值迭代方法层出不穷,本期就不赘述了。因为,我已经憋不出了!我要开始用Tensorflow框架来实现了!!

全连接网络的TensorFlow实现

Tensorflow是谷歌公司基于图结构来实现深度学习的一个框架。说简单点就是你要先把神经网络结构画出来,然后再创建一个程序会话来运行它。针对上述这个全连接网络,我们来用tensorflow框架来描述一下这个结构。

首先在python3.6中引入tensorflow模块(版本为tensorflow1.4):

然后我们来定义一个网络结构:

这时候我们发现,有了这个结构以后,还需要权重矩阵w、偏执项(也就是线性组合的截距)b和输入x。那就先构造一下权重矩阵和偏执项的生成函数:

然后是生成输入的数据变量,注意在tensorflow中,这些都是静态的占位变量,需要实际的输入真正的数据才能运行。

根据上述的逻辑,我们生成网络的学习输出:

根据输出设计损失函数,这里面使用交叉熵损失函数:

为了求解损失函数的最小值,选择优化器,这里选择随机梯度下降法,设置学习率为0.5(学习率是什么你给我后台留言吧!!反正我也不一定看得见):

完成上述的建模过程以后,一定要注意!!这些都只是静态过程,需要如下的一个程序会话创建过程来运行他们。

关于x_train 和y_train大家可以自己选择,我是用的著名的手写识别数字mnist,具体的代码可以看我拙略的码云仓库:

https://gitee.com/wangyi666/tensorflow-learning/blob/master/netModel.py

至此,一个简单的全连接神经网络就写完了,如果你还没明白,赶紧点一下关注,因为下次,我要录个短视频,应该不鸽。

谢谢你的浏览。

愚人节快乐

封面图片: 新浪微博-冯提莫

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180401G1C96A00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券