深度学习概念总结之TensorFlow

神经元(Neuron):是构成一个神经网络的最小单元

算法网络结构:传统前向传播算法FP和反向传播算法BP等都是全连接网络结构;深度学习算法CNN,DNN等都是局部连接网络结构

神经网络参数优化:一个最简单的神经元结构的输出就是所有输入的加权和,而不同输入的权重就是神经元的参数;神经元的优化过程就是优化神经元中参数取值的过程

隐藏层(Hidden Layers):神经网络输入层和输出层中间的所有过程层,每个隐藏层由许多个隐藏单元(Hidden unit)组成,

TensorFlow中变量和张量关系:变量声明函数 tf.Variable 是一个运算,这个运算的输出结果就是一个张量,张量也就是tensorflow里面所谓的变量

TensorFlow中集合概念:程序所有创建的变量都会被自动加入到 GraphKeys.VARIABLES 这个集合,通过 tf.all_variables 函数可以拿到当前计算图上所有的变量


tensorflow优化器:训练比较常用的三种优化器,TensorFlow支持7中优化器

  1. GradientDescentOptimizer :梯度下降优化器
  2. AdamOptimizer :adam优化器,适用于稀疏矩阵优化
  3. MomentumOptimizer 
  4. AdagradOptimizer 
  5. AdagradDAOptimizer 
  6. FtrlOptimizer 
  7. RMSPropOptimizer
  8. Optimizer :优化器的基类,以上所有的优化器都是这个类的子类
  9.  各种优化器适用的场景见:http://doc.okbase.net/guoyaohua/archive/284335.html

训练神经网络的过程可以分为三个步骤:

  1. 定义神经网络的结构和前向传播的输出结果
  2. 定义损失函数以及选择反向传播优化的算法
  3. 生成会话(tf.Session)并且在训练数据上反复运行反向传播算法
""" 训练模型步骤 """
# 定义损失函数
cross_entropy = -tf.reduce_mean(y_*tf.log(tf.clip_by_value(y,e-10,1.0)))
# 定义学习率
learning_rate = 0.001
# 定义反向传播算法
train_step = tf.train.AdamOptimizer(learning_rate).minimize(cross_entropy)

张量:张量是TensorFlow的数据模型,TensorFlow中的所有运算的输入、输出都是张量,张量本身不存储任何数据,它只是对计算结果的引用

会话:是TensorFlow的运算模型,它管理一个TensorFlow程序拥有的系统资源,所有的运算都要通过会话执行


神经网络中的非线性矫正:如果每一个隐藏层只是进行加权求和,得到的结果和普通的线性模型模型不会有什么不同;为了使神经网络具有处理非线性特征数据的能力,在生成隐藏层之后,我们要对结果进行非线性的矫正(rectifying nonlinearity),简称为relu(rectified linear unit)或者进行双曲正切处理(tangens hyperbolicus),简称为 tanh

激活函数主要作用是提供网络的非线性建模能力,如果没有激活函数,那么该网络仅能够表达线性映射,此时即便有再多的隐藏层,其整个网络跟单层神经网络也是等价的。因此也可以认为,只有加入了激活函数之后,深度神经网络才具备了分层的非线性映射学习能力;激活函数(sigmoid函数,tanh函数,Relu函数,Linear函数);其中Relu的函数性能最优,其次是tanh,以下是激活函数优缺点:

  1. sigmoid函数使用比较少,因为收敛速度比较慢,严重影响了训练的效率,sigmoid有其自身的缺陷,最明显的就是软饱和性;软包和即函数两侧的导数逐渐趋向于0
  2. tanh函数也存在软饱和问题,使梯度消失,导致训练效率低下,与sigmoid相比,它的输出均值是0,使得其收敛速度要比sigmoid快,减少迭代次数
  3. Linear函数线性激活函数,性能最差
  4. Relu函数相比sigmoid和tanh函数,Relu激活函数的优点在于:
  • 梯度不饱和。梯度计算公式为:1{x>0}1{x>0}。因此在反向传播过程中,减轻了梯度弥散的问题,神经网络前几层的参数也可以很快的更新。
  • 计算速度快。正向传播过程中,sigmoid和tanh函数计算激活值时需要计算指数,而Relu函数仅需要设置阈值。如果x<0,f(x)=0x<0,f(x)=0,如果x>0,f(x)=xx>0,f(x)=x。加快了正向传播的计算速度。
  • 因此,Relu激活函数可以极大地加快收敛速度,相比tanh函数,收敛速度可以加快6倍
# tensorflow中的激活函数
tf.nn.relu(features, name=None)
tf.nn.relu6(features, name=None)
tf.nn.softplus(features, name=None)
tf.nn.dropout(x, keep_prob, noise_shape=None, seed=None, name=None)
tf.nn.bias_add(value, bias, name=None)
tf.sigmoid(x, name=None)
tf.tanh(x, name=None)

详细讲解激活函数链接:http://www.tensorfly.cn/tfdoc/api_docs/python/nn.html

激活函数参考网址:https://blog.csdn.net/u012526120/article/details/49149317

                                https://blog.csdn.net/u014595019/article/details/52562159


损失函数(loss function):作用是用来估量你模型的预测值f(x)与真实值Y的不一致程度,它是一个非负实值函数,通常使用L(Y, f(x))来表示,损失函数越小,模型的鲁棒性就越好。损失函数是经验风险函数的核心部分,也是结构风险函数重要组成部分。模型的结构风险函数包括了经验风险项和正则项;

  • 监督学习有两种策略:经验风险最小化和结构风险最小化
  • 经验风险:训练数据集的平均损失;经验风险最小化的策略认为经验风险最小的模型就是最优的模型,但是当样本的容量很小时,经验风险最小化的策略容易产生过拟合的现象
  • 结构风险:是在经验风险的基础上加上表示模型复杂度的正则化或罚项,可以防止过拟合

常用的损失函数:最小平方误差准则(MSE)、交叉熵(cross-entropy)、对数似然函数(log-likelihood)、指数损失函数(exp-loss)、Hinge损失函数(Hinge-loss)、0-1损失函数、绝对值损失函数

""" TensorFlow定义损失函数,以下三个函数用意在找到使目标函数最小时的值 """
# mse
mse = tf.reduce_sum(tf.square(y_ -  y))
# 交叉熵
cross_entropy = -tf.reduce_mean(y_ * tf.log(tf.clip_by_value(y, 1e-10, 1.0))) 
# softmax回归后的交叉熵
cross_entropy = tf.nn.softmax_cross_entropy_with_logits(y,y_)

损失函数讲解参见:https://blog.csdn.net/shenxiaoming77/article/details/51614601


反向传播优化算法:随机梯度下降(SGD)、动量(Momentum)、涅斯捷罗夫(Nesterov)算法、Adagrad、Adadelta、Adam、Adamax、Nadam.


交叉熵:判断一个输出向量和期望向量的接近程度,交叉熵刻画了两个概率分布之间的距离,它是分类问题中使用比较广的一种损失函数;交叉熵的值越小,两个概率分布就越接近

Softmax回归:是一个常用来将将神经网络前向传播得到的结果变成概率分布,可以作为一个学习算法来优化分类结果,但在TensorFlow中softmax的回归参数被去掉了,它是一层额外的处理层,将神经网络的输出变成一个概率分布

平均滑动模型:可以使模型在测试数据上更健壮的方法,在采用随机梯度算法训练神经网络时,使用滑动平均模型在很多应用中都可以在一定程度提高最终模型在测试数据上的表现,在TensorFlow中提供 tf.train.ExponentialMovingAverage(0.99, step)来实现

过拟合问题:为了避免过拟合问题,一个非常常用的方法就是正则化,正则化的思想就是在损失函数中加入刻画模型复杂程度的指标,在TensorFlow中提供 tf.contrib.layers.l1_regularizer(w) 来实现

学习率:在训练神经网络的过程中,合理的设置学习率是一个非常重要的事情,对于训练一开始的时候,设置一个大的学习率,可以快速进行迭代,在训练后期,设置小的学习率有利于模型收敛和稳定性;所以一般的学习率都设置成自动衰减学习率

tf.train.exponential_decay(learing_rate, global_step, decay_steps, decay_rate, staircase=False)
以下参数解释:
    learning_rate:学习率
    global_step:全局的迭代次数
    decay_steps:进行一次衰减的步数
    decay_rate:衰减率
    staircase:默认为False,如果设置为True,在修改学习率的时候会进行取整

卷积神经网络与传统全连接神经网络对比:训练一个卷积神经网络和传统神经网络没有任何区别,唯一的区别就在于网络中相邻两层的连接方式。

卷积神经网络主要由以下5种结构组成:

1、输入层 2、卷积层  3、池化层  4、全连接层   5、Softmax层


卷积层

又被称之为过滤器(filter)或者内核(kernel)

  • 过滤器所处理的节点的长和宽都是由人工指定的,这个节点矩阵的尺寸也被称之为过滤器的尺寸,常用的过滤器的尺寸有3x3或5x5
  • 因为过滤器处理矩阵深度和当前层神经网络节点矩阵的深度是一致的,所以虽然节点矩阵是三维的,但是过滤器的尺寸只需要指定两个维度(长、宽)
  • 为了避免输入矩阵和输出矩阵大小不一致,可以在当前矩阵边界填充0解决
  • 共享每一个卷积层中过滤器中的参数可以巨幅减少神经网络上的参数
  • 通过卷积层处理过的节点矩阵维度会变得更深

池化

池化可以非常有效的缩短矩阵的尺寸,从而减少最后全连接层中的参数

  • 使用池化既可以加快计算速度,也有防止过拟合问题的作用
  • 池化层不会改变三维矩阵的深度,但是它可以缩小矩阵的大小
  • 池化操作可以认为是将一张分辨率较高的图片转化为分辨率较低的图片
  • 池化层过滤器中计算的不是节点的加权和,而是采用更加简单的最大值或者平均值运算
  • 使用最大值操作的池化层被称之为最大池化层(max pooling),这是使用的最多的池化层结构;使用平均值操作的池化层被称之为平均池化层(average pooling),其它池化层在实际中应用比较少
  • 池化层操作和卷积层的过滤器类似,主要区别是卷积层使用的过滤器横跨整个深度的,而池化层使用的过滤器只影响一个深度上的节点,所以池化层的过滤器除了在长和宽两个维度移动之外,还需要在深度这个维度上移动

L1正则化与L2正则化的区别与联系

L2正则化:直接在原来的损失函数基础上加上权重参数的平方和,公式如下:L=Ein+λ∑jw2j

L1正则化:直接在原来的损失函数基础上加上权重参数的绝对值,公式如下:L=Ein+λ∑j|wj|

正则化的优点:正则化是结构风险最小化的一种策略实现,通过降低模型的复杂度能够有效降低过拟合,增加模型的泛化能力;损失函数实际上包含了两个方面:一个是训练样本误差,一个是正则化项。其中,参数 λ 起到了权衡的作用。

两者的相同点:能够有效降低过拟合,可以改变权重系数的大小

两者的不同点:L1正则化相比L2正则化更容易使系数变成0,选择更少的特性从而形成训练模型

应用:如果数据特征过多,其中只有一小部分是真正重要的,那么使用L1正则化效果比较好,否则使用L2正则化比较好

L1和L2正则化模型推导参考链接

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值