深度学习概念之TensorFlow

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

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

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

隐藏层:神经网络输入层和输出层中间的所有过程层

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程序拥有的系统资源,所有的运算都要通过会话执行


激活函数主要作用是提供网络的非线性建模能力,如果没有激活函数,那么该网络仅能够表达线性映射,此时即便有再多的隐藏层,其整个网络跟单层神经网络也是等价的。因此也可以认为,只有加入了激活函数之后,深度神经网络才具备了分层的非线性映射学习能力;激活函数(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层

猜你喜欢

转载自blog.csdn.net/u012089823/article/details/81948752