深度学习基础及tensorflow框架---学习笔记

1、tensorflow框架基础问题
①tensorflow-gpu版环境配置
为了在服务器GPU上进行加速运算,安装tensorflow-gpu版,安装默认gpu版本之后发现tensorflow无法使用,在于最新tensorflow-gpu版与服务器已有的NVIDIA并行计算架构CUDA9.0版本不兼容,隧将tensorflow-gpu降级到1.8.0后代码调试成功。

②tensorflow计算图
tensorflow是一个通过计算图的形式来表述计算的编程系统,tensorflow中的每一个计算都是计算图上的一个节点,而节点与节点直接的边描述了计算之间的依赖关系。ensorflow会自动将定义的计算转化为计算图上的节点,通过tf.get_default_graph函数可以获取当前默认的计算图,也可以利用tf.Graph函数来生成新的计算图,不同计算图上的张量及运算都不会共享。

③tensorflow运算资源管理
运行上Tensorflow程序的时候程序我们会遇到一个问题,运行时程序会自动调用所有能调用到的资源,并且全占满,在自己的PC上没问题,但是在服务器上,问题就很大,因为一旦你运行程序,占满显存别人就不能再用了,解决方法是我们通常是给程序运行指定一块GPU,然后限制其使用比例,此外通过config.gpu_options.allow_growth = True指令程序按可以需申请内存。

④tensorflow中张量的概念
从功能上看,张量可以简单的理解为多维矩阵,但在tensorflow中张量的实现并不是直接采用数组的形式,它只是对tensorflow中运算结果的引用。在张量中并没有真正保存数字,而是保存得到这些数字的计算结果。Tensorflow中张量主要保存三个属性:名字、维度和类型。其中名字不仅是一个张量的唯一标识,它同样也给出了这个张量是如何计算来的,类型问题,当计算操作元素不符合张量类型时会导致报错。

⑤tensorflow运算模型—Session
Tensorflow中会话session来执行定义好的运算,会话拥有并管理tensorflow程序运行时的所有资源。

⑥神经网络参数与tensorflow变量
利用tf.variable函数生成变量,利用tf.global_variables_initializer()实现初始化所有变量的过程,只有在执行sess.run()命令后才进行运算和输出。如果声明变量时参数trainable为True,那么这个变量将会被加入到GraphKeys.TRAINABLE_VARIABLES集合,tensorflow中提供的神经网络优化算法会将上述集合中的变量作为默认的优化对象。Tensorflow提供了placeholder机制用于提供输入数据,placeholder相当于定义了一个位置,这个位置中的数据在程序运行时再指定。这样在程序中就不需要生成大量的常量来提供输入数据,而只需要将数据通过placerholder传入tensorflow计算图。

2、深度学习与tensorflow
①训练神经网络的三个步骤
1.定义神经网络的结构和前向传播的输出结果
2.定义损失函数以及选择反向传播优化算法
3.生成会话并且在训练数据上反复运行反向传播优化算法。

②激活函数实现非线性化
如果将每一个神经元的输出为所有输入的加权和,这导致整个神经网络是一个线性模型。如果将每一个神经元的输出通过一个非线性函数,那么整个神经网络的模型也就不再是线性的了,这个非线性函数就是激活函数。从而利用深度学习解决非线性问题。

③损失函数
统计学中损失函数是一种衡量损失和错误程度的函数,神经网络模型的效果以及优化的
目标是通过损失函数来定义的。
交叉熵是分类问题常用的评价方法之一,交叉熵刻画了两个概率分布之间的距离。利用softmax回归可以将神经网络前向传播得到的结果变成一个概率分布,就可以利用交叉熵来计算预测的概率分布和真实答案的概率分布之间的距离了。
Softmax公式:

交叉熵公式:

交叉熵不是对称的,H(x,y)不等于H(y,x),它刻画的是通过概率分布y来表达概率分布x的困难程度,因为正确答案是希望得到的结果,所以当交叉熵作为神经网络的损失函数时,x代表的是正确答案,y代表的是预测值,交叉熵越小,表示两个概率分布越接近。

交叉熵公式:
cross_entropy = -tf.reduce_mean( y_ * tf.log(tf.clip_by_value(y,le-10, 1.0)))

利用softmax计算交叉熵
cross_entropy=tf.nn.softmax_cross_entropy_with_logits(_sentinel=None,labels=None, logits=None, dim=-1, name=None)

与分类问题不同,回归问题解决的是对具体数值的预测,最常用的损失函数是均方差MSE
mse = tf.reduce_mean(tf.square(y_ - y))

对于一些特定问题,可以根据需要自定义损失函数,以解决实际问题。

④神经网络优化算法
为了使模型在训练数据上的损失函数尽可能的小,梯度下降算法主要用于单个参数的取值,而反向传播算法算法给出了一个在所有参数上使用梯度下降算法的高效方式,在优化参数时,需要选择合适的学习率来定义参数更新的幅度。
神经网络的优化过程可以分为两个阶段,第一个阶段先通过前向传播算法计算的到预测值,并将预测值和真实值作对比的到两者之间的差距。然后在第二阶段通过反向传播算法计算损失函数对每一个参数的梯度,再根据梯度和学习率使用梯度下降算法更新每一个参数。
需要注意的是,梯度下降算法并不能保证被优化的函数达到全局最优解,只有当损失函数为凸函数时,梯度下降算法才能保证达到全局最优解。
在海量训练数据下,要计算所有训练数据的损失函数是非常消耗时间的,为了加速训练过程可以使用随机梯度下降算法。这个算法不是在全部训练数据上优化损失函数,是在每一轮迭代中,随机优化某一条训练数据上的损失函数,这样能大大加快每一轮参数更新,但弊端在于这样做可能达不到全部数据上损失函数最小,为了综合梯度下降和随机梯度下降算法的优缺点,采用了batch的方式,每次计算一小部分训练数据的损失函数,每次使用一个batch可以大大减小收敛所需的迭代次数,同时可以使收敛到的结果更接近梯度下降的效果。

⑤过拟合问题
实际问题中想要的并不是让模型尽量模拟训练数据的行为,而是希望通过训练出来的模型对未知的数据给出判断。所谓过拟合,指的是当一个模型过为复杂之后,它可以很好“记忆”每一个训练数据中随机噪音的部分而忘记了要去“学习”训练数据中通用的趋势。
为了避免过拟合问题,一个非常常用的方法是正则化(regularization)。正则化的思想就是在损失函数中加入刻画模型复杂程度的指标。
以下代码给出了一个简单的带L2正则化的损失函数定义:

猜你喜欢

转载自blog.csdn.net/qq_23589775/article/details/83057394