TensorFlow精进之路(八):神经元
1、概述
喝完奶茶继续干,通过前面的学习,对深度学习似乎有那么点感觉了,本来想继续往下学学一些应用的例子的,但是现在我想还是系统的先把一些深度学习的基本概念总结一下,以及先系统的学习一下tensorflow的编程基础,工欲善其事,必先利其器。这一节就先说说神经元吧。
2、单个神经元
单个神经元网络模型如上图所示(画的有点丑),计算公式如下:
y = x0w+x1w+...+xnw+b=Ʃwi × xi + b = w • x + b
其中,y为输出结果,x为输入,w为权重,b为偏置。
训练神经网络,其实就是不断的调整w和b的值,使之得到一个合适的值,最终这个值配合运算公式形成的逻辑,就是神经网络的模型。
1、前向传播
不同的神经网络结构前向传播的方式是不一样的,最简单的前向传播算法就是上面的公式,输入x经过与权重w的加权和再加上偏置b,得到的结果y。
2、反向传播
网络训练前,我们当然不知道w和b的值是多少才是合适的值,反向传播的作用就是根据前向传播的到的结果与实际标签的误差,反馈给网络,网络根据误差来调整权重以得到更优值。
在实际应用中,一般都是经过多次迭代,一点一点修正w和b的值,直到模型的输出和实际标签的误差小于我们设定的某个阈值为止。
3、损失函数
损失函数就是我们上面说的用于描述模型输出结果和实际值的差距大小。
常用的损失函数有均方误差(MSE)和交叉熵。
5.1、均方误差
均方误差,也叫均值平方差,对于回归问题,一般最常用的损失函数就是均方误差。公式如下:
MSE = (Ʃj(yj - y`j)2) / n
其中,y表示真实值,y`表示预测值。
tensorflow实现均方误差的函数为:
mse = tf.reduce_mean(tf.square(y_ - y))
5.2、交叉熵
对于分类问题,一般最常用的损失函数是交叉熵。
假设两个概率分布p和q,通过q来表示p的交叉熵如下:
H(P) = - Ʃxp(x) log q(x)
tensorflow实现交叉熵的函数为:
cross_entropy = -tf.reduce_sum(labels * tf.log(logits))
或者
cross_entropy = tf.nn.softmax_cross_entropy_with_logits(logits, labels)
5.3、分类问题和回归问题
既然上面说到分类问题和回归问题,这里就介绍一下这两类问题。
分类问题:分类问题希望解决的是将不同的样本分到事先定义好的类别中,比如判断一个零件是否合格的问题就是一个二分类问题。手写体数字识别问题是一个十分类问题(0~9十个数字)。
回归问题:回归问题解决的是对具体数值的预测。比如房价预测、销量预测等。这些问题所需要预测的不是一个事先定义好的类别,而是任意实数。解决回归问题一般只有一个输出节点,这个节点的输出值就是预测值。
6、优化器
前面说过,反向传播是将预测值与实际值之间的误差,反馈给网络,网络再去优化权重,怎么优化权重,就是优化器函数该做的事了。常用的优化算法有梯度下降法。
如上图所示,假设θ表示神经网络的参数,J(θ)表示在给定的参数取值下,训练数据集上损失函数的大小,那么整个优化过程可以理解为寻找一个参数θ,使得J(θ)最小。梯度下降法会迭代式更新参数θ,不断沿着梯度的反方向让参数总是朝着总损失更小的方向更新。
tensorflow中,一般的梯度下降函数为:
tf.train.GradientDescentOptimizer
tf.train.AdadeltaOptimizer
tf.train.AdagradOptimizer
tf.train.MomentumOptimizer
tf.train.AdamOptimizer
tf.train.FtrlOptimizer
tf.train.RMSPropOptimizer
目前最常用的优化器是tf.train.AdamOptimizer函数。
在循环里面使用tf.train.AdamOptimizer函数接着minimize(loss)函数,优化器就会沿着loss最小值的方向优化参数了。比如:
train_step = tf.train.AdamOptimizer(learning_rate).minimize(loss)
7、学习率
每个优化器都会有一个学习率的参数,设置学习率的大小,是在精度和速度之间找到一个平衡,学习率决定了每次更新的速度,如果幅度过大,可能导致参数在极忧值两侧来回移动,如果幅度过小,就会大大降低优化速度。为了解决这个问题,tensorflow提供了一种更加灵活的学习率设置方法----指数衰减法。
tensorflow提供了tf.train.exponential_decay(learning_rate,global_step, decay_steps, decay_rate,staircase=False, name=None)
函数来设置指数衰减学习率,learning_rate代表初始学习率,如果staircase=True,则表示没有衰减功能。
8、激活函数
线性模型的局限性:只通过线性变换,任意层的全连接神经网络和单层神经网络的表达能力并没有任何区别,线性模型能解决的问题是有限的。
激活函数的目的是去线性化,如果将每一个神经元的输出通过一个非线性函数,那么整个神经网络的模型也就不再是线性的了,这个非线性函数就是激活函数。
8.1、ReLU函数
ReLU函数是个非常常用的激活函数,其公式为:
f(x) = max(0, x)
即,大于0的为其本身,否则为0.
tensorflow中,该激活函数为,
tf.nn.relu()
8.2 Sigmoid函数
其公式为:
y = 1 / (1 + e-x)
其中,x的范围为正无穷大到负无穷大,y的范围为0到1.
如上图所示,经过Sigmoid函数输出的函数都会在0~1区间里,但,可以看出,当x=10和x=1000其实输出的y差距并不大,所以可以看出,Sigmoid函数极限在x为-6到6之间,其中x在-3到3之间效果比较好。
tensorflow中,该激活函数为
tf.nn.sigmoid()
8.3 Tanh函数
其公式为:
y = (1 - e-2x) / (1 + e-2x)
其中,x的范围为正无穷大到负无穷大,y的范围为-1到1.
tensorflow中,该激活函数为
tf.nn.tanh()
8.4 Swish函数
Swish激活函数的效果优于ReLU函数,公式如下:
y = x * sigmoid(βx)
其中,β为x的缩放参数,一般取1即可。
Tensorflow好像还没有定义该函数,但是我们可以用sigmoid函数自己定义,
def swish(x, b = 1):
return x * tf.nn.sigmoid(b * x)
9、Softmax函数
Softmax函数主要用来处理分类问题,该函数将前向传播结果转为概率问题,所有概率之和为1。例如对(a, b, c)用softmax函数后为,
(ea/(ea+eb+ec), eb/(ea+eb+ec), ec/(ea+eb+ec)).
在实际使用中,softmax函数的分类,一般都将分类标签转成one-hot编码,需要分成几类,就在这层放几个节点。例如前面说的MNIST数据集和CIFAR10数据集,最后一层的输出都是10个节点,因为这两个数据集都是十分类问题。
Tensorflow中,softmax函数为
tf.nn.softmax()
10、过拟合问题
所谓过拟合,指的是当一个模型过为复杂之后,它可以很好的记忆每一个训练数据中随机噪音的部分而忘了要去学习训练数据中的趋势。过度拟合训练数据中的随机噪音虽然可以得到非常小的损失函数,但是对于未知数据可能无法做出可靠的判断。如下图所示:
10.1 正则化
为了避免过拟合问题,一个非常常用的方法是正则化(regularization)。
正则化的思想是在损失函数中加入刻画模型复杂程度的指标。假设用于刻画模型在训练数据上表现的损失函数为J(θ),那么优化时不是直接优化J(θ),而是优化J(θ) + λR(w),其中R(w)刻画的是模型的复杂程度,λ表示模型复杂损失在总损失中的比例。
常用的正则化函数有L1正则化函数和L2正则化函数,
L1正则化:
R(w) = Ʃ|wj|
L2正则化:
R(w) = Ʃ|wj2|
Tensorflow中L1和L2正则化函数分别为:
tf.contrib.layers.l1_regularizer()
Tf.contrib.layers.l2_regularizer()
10.2 Dropout
避免过拟合问题,除了正则化,还有dropout,dropout在不同的训练过程中随机“丢掉”一部分神经元,让其不工作,但这个“丢掉”只是针对当前训练步骤的,让其在这次训练中不更新权值,也不参与这次的神经网络计算,下次训练时,这个神经元又可能工作。
前面《tensorflow学习笔记 两层卷积神经网络模型训练MNIST》例子就用到这个方法,
Tensorflow中,dropout函数为
tf.nn.dropout()
11、滑动平均模型
滑动平均模型可以使模型在测试数据上更加健壮。在采用随即梯度下降法训练神经网络时,使用滑动平均模型在很多应用中可以在一定程度上提高最终模型在测试数据上的表现。
tansorflow提供了tf.train.ExponentialMovingAverage来实现滑动平均模型。在初始化该函数时需要提供一个衰减率(decay),这个衰减率将用于控制模型更新的速度。decay决定了模型更新速度,decay越大,模型越趋于稳定,一般设置成非常接近1的数,比如0.999或0.9999。
TensorFlow精进之路(八):神经元相关推荐
- TensorFlow精进之路(三):两层卷积神经网络模型将MNIST未识别对的图片筛选出来
1.概述 自从开了专栏<TensorFlow精进之路>关于对TensorFlow的整理思路更加清晰.上两篇讲到Softmax回归模型和两层卷积神经网络模型训练MNIST,虽然使用神经网络能 ...
- TensorFlow精进之路(十二):随时间反向传播BPTT
1.概述 上一节介绍了TensorFlow精进之路(十一):反向传播BP,这一节就简单介绍一下BPTT. 2.网络结构 RNN正向传播可以用上图表示,这里忽略偏置. 上图中, x(1:T)表示输入序列 ...
- TensorFlow精进之路(九):TensorFlow编程基础
1.概述 卷积部分的知识点在博客:TensorFlow精进之路(三):两层卷积神经网络模型将MNIST未识别对的图片筛选出来已经写过,所以不再赘述.这一节简单聊聊tensorflow的编程基础. 2. ...
- tensorflow精进之路(二十八)——人脸识别(下)(MTCNN人脸检查和人脸对齐+CASIA-WebFace数据集模型)
1.概述 这一讲,我们来训练自己的人脸识别模型. 2.下载CASIA-WebFace人脸数据集 CASIA-WebFace人脸数据集包含了10575个人的494414张人脸图片,需要在 http:// ...
- tensorflow精进之路(十八)——python3网络爬虫(中)
1.概述 上一节简单的介绍了一些python3网络爬虫的知识,这一节就运用上一节的知识写个小demo,用于爬去汽车之家网站的汽车厂商及车型名称. 2.打开待爬取网页 打开汽车之家官网, https:/ ...
- TensorFlow精进之路(七):关于两层卷积神经网络对CIFAR-10图像的识别
1.概述 在前面已经对官方的CIFAR10图像识别模块进行分析,但如果只做到这一步感觉还是不够,没能做到举一反三以及对之前学的知识的巩固,所以这一节,我打算结合之前学的双层卷积神经网络自己写一个dem ...
- tensorflow精进之路(二十七)——人脸识别(中)(MTCNN人脸检查和人脸对齐+FaceNet模型)
1.概述 上一讲,我们讲了人脸识别的基本原理,这一讲,我们用tensorflow来实现它. 2.下载LFW人脸数据集 2.1.LFW数据集简介 LFW人脸数据集主要用来研究非受限情况下的人脸识别问题, ...
- tensorflow精进之路(二十六)——人脸识别(上)(MTCNN原理)
1.概述 换了个固态硬盘,本想装最新的系统mint 19,谁知道却是个坑,NVIDIA驱动和CUDA工具老是装不上去,各种问题,折腾了几天,还是用回了原来的系统.不过,这次软件改了一下,使用了pyth ...
- tensorflow精进之路(二十五)——Object Detection API目标检测(下)(VOC数据集训练自己的模型进行目标检测)
1.概述 上一讲,我们使用了别人根据COCO数据集训练好的模型来做目标检测,这一讲,我们就来训练自己的模型. 2.下载数据集 为了方便学习,我们先使用别人整理好的数据集来训练---VOC 2012数据 ...
最新文章
- c语言将字母与数字分开存放,2017年计算机二级《C语言》考前提分试题及答案9...
- (转)iOS7界面设计规范(9) - UI基础 - 动画
- js事件(Event)知识整理
- python中的序列化与反序列化
- php能否缓存,PHP缓存实现
- 用rest造句子_rest的用法和短语例句
- @PropertiesSource注解读取配置文件中的数据
- Web 基础架构:负载均衡和LVS
- ADOMDConnection连接字符串与AnalysisService服务器配置
- Android开发笔记——快速入门(从入门ACT到Fragment放肆)
- 泛微OA设置系统默认水印
- 笔试题:输入0123456789对应输出“一二三四五六七八九”
- 新浪邮箱服务器设置,新浪企业邮箱|帮助中心
- HNU暑假程序设计训练 0419
- 不同分辨率标准,720p 1080p 2k 4k HD FHD UHD
- 移动平均法 and 指数平滑法
- ssh @ ssh: Could not resolve hostname : Name or service not known
- 同一plan节点的targetlist和qual中是对同一var的指针吗?
- windows电影杀毒linux程序,两部Linux有关的电影:《操作系统革命》《代码》
- 酷柚易汛进销存-如何新增账户?
热门文章
- 《强化学习》中的第14章:心理学
- Tomcat Insufficient space for shared memory file
- 【操作系统/OS笔记10】进程/线程的调度原则、调度算法、实时调度、多处理器调度、优先级反转
- linux下bus、devices和platform的基础模型 【转】
- 前端框架——Jquery——基础篇7__工具函数(Utils)
- 清华大学计算机期末试题,清华大学计算机系C++期末考试题及答案.doc
- java common-lang_common-lang3工具类-使用手册
- JAVA获取同一路径下所有子类或接口实现类
- Oracle IO问题解析(一)
- Deteming the User Intent of Web Search Engine