深度学习】Tensoflow的一些基础介绍(一)"/>
【深度学习】Tensoflow的一些基础介绍(一)
文章目录
- 前言
- 一、可视化工具
- 二、TensorFlow基础知识
- 2.1 TensorFlow的设计理念
- 2.2 TensorFlow的编程模型
- 2.2.1 边
- 2.2.2 节点
- 2.3 其他概念
- 2.3.1 图
- 2.3.2 会话
- 2.3.3 设备
- 2.3.4 变量
- 2.3.5 内核
- 2.4 常用API
- 2.4.1 图、操作和张量
- 2.4.1 可视化
前言
正所谓,机器学习是实现人工智能的方法,而深度学习是实现机器学习算法的技术,既然是技术那就涉及到一些具体的啦,天啦撸,Tensorflow就是其中之一,
为了学习和自然语言相关的一些知识,涉及到了神经网络,不言而喻有过渡到了深度学习,既然到了深度学习那就不得不了解学习一下Tensorflow,所以,接下来可爱的我将带您了解一下关于Tensorflow的一些常规知识,学习深度学习怎么能不知道Tensorflow了那,您说是吧,,,,,,
没事就来一个完美的分割线吧,亲爱的,,,,,,
一、可视化工具
不管我们学习什么,搞什么东西,那些理论知识,精神层面的都是平常我们不喜欢去接受的,更直白一点的是:您能打字给我说事就不要用语音,因为您的普通话不标注,我怕您说把上调说出上吊,,,,哈哈皮一下皮一下,所以说能用图像表达直观表达的,就不要用文字,这样更OK一点,所以,在神经网络中同样也是,搞什么神经网络,大数据这些玩意,都是和数字,语料打交道,我们最终的目的是实现我们自己预期的效果,那既然是效果,自然用图示来表示,自然更直观一点啦。在神经网络中就有专门的可视化工具。
1、PlayGround
关于PlayGround主要是由:数据(DATA),特征(FEATURES),隐藏层(HIDDENLAYERS),连接线和输出(OUTPUT),至于具体的,可去自行搜索奥。
2、TenSorBoard
同样,TenSorBoard是TensorFlow自带的一个强大的可视化工具,也是一个web应用程序套件。TensorBoard 目前支持7 种可视化,即SCALARS、IMAGES、AUDIO、GRAPHS、DISTRIBUTIONS、HISTOGRAMS 和EMBEDDINGS。这7 种可视化的主要功能如下。
● SCALARS:展示训练过程中的准确率、损失值、权重/偏置的变化情况。
● IMAGES:展示训练过程中记录的图像。
● AUDIO:展示训练过程中记录的音频。
● GRAPHS:展示模型的数据流图,以及训练在各个设备上消耗的内存和时间。
● DISTRIBUTIONS:展示训练过程中记录的数据的分布图。
● HISTOGRAMS:展示训练过程中记录的数据的柱状图。
● EMBEDDINGS:展示词向量(如Word2vec)后的投影分布。
好嘛,至于功能具体的那就在只能在实际应用中,再次记录吧,好赖,那咋们继续往下走之前在给他任性的来个分割线吧!!!
二、TensorFlow基础知识
在介绍TensorFlow基础知识之前,先抛出两个非常之重要而链接:TensorFlow官方网站的新手入门和扩展程序
1、
2、
以上就是tensorflow的系统框架图,其中设置管理层为上层提供了一个统一的接口。
2.1 TensorFlow的设计理念
首先,我们必须滴清楚编程模式通常有:命令式编程和符号式编程
1、命令式编程:就是通常意义上的程序,很容易理解和调试,按照原有逻辑执行即可。
2、符号式编程:涉及到很多的嵌入和优化,不容易理解和调试,但是运行速度特别高
例如:
命令式编程:即一步一步告诉计算机先做什么再做什么。比如:如果你想在一个数字集合 collection(变量名) 中筛选大于 5 的数字,你需要这样告诉计算机:
第一步,创建一个存储结果的集合变量 results;
第二步,遍历这个数字集合 collection;
第三步:一个一个地判断每个数字是不是大于 5,如果是就将这个数字添加到结果集合变量 results 中。
List<int> results = new List<int>();
foreach(var num in collection)
{if (num > 5)results.Add(num);
}
符号式编程:为什么很多深度学习框架使用symbolic风格? 最主要的原因式效率,内存效率和计算效率都很高。符号式编程一般是先定义各种变量,然后建立一个数据流图,在数据流图中规定各个变量之间的计算关系。
t = 1+2
print(t)
任性的分割线又来了~~~~~~~~
如上面关于符号式编程的举例,在传统的程序操作中,定了t的变量之后,在运行时候就执行了且输出3。而在tensorflow中,数据流图的节点,实际上对应的是tensorflow的API中的一个操作,并没有真正去执行。
import tensorflow as tf
t = tf.add(1,2)
print(t) # 输出tensor(“Add_1:0”,shape=(),dtype=int32)
在tensorflow中涉及的运算都要放在图中,而图的运算只发生在会话(session)中。开启会话之后,就可以用数据去填充节点,进行运算;关闭会话之后,就不能进行计算了。所以:会话提供了操作运行和Tensor求值的环境。
2.2 TensorFlow的编程模型
TensorFlow 是用数据流图做计算的,因此需要先创建一个数据流图(也称为网络结构图),如下图所示,看一下数据流图中的各个要素。讲述了TensorFlow 的运行原理。图中包含输入(input)、塑形(reshape)、Relu 层(Relulayer)、Logit 层(Logit layer)、Softmax、交叉熵(cross entropy)、梯度(gradient)、SGD 训练(SGD Trainer)等部分,是一个简单的回归模型。
它的计算过程是:
1、首先从输入开始,经过塑形后,一层一层进行前向传播运算。Relu 层(隐藏层)里会有两个参数,即 W h 1 W_{h1} Wh1和 b h 1 b_{h1} bh1,在输出前使用ReLu(Rectified Linear Units)激活函数做非线性处理。
2、然后进入Logit 层(输出层),学习两个参数 W s m W_{sm} Wsm和 b s m b_{sm} bsm。
3、用Softmax来计算输出结果中各个类别的概率分布。
4、用交叉熵来度量两个概率分布(源样本的概率分布和输出结果的概率分布)之间的相似性。
5、然后开始计算梯度,这里是需要参数 W h 1 W_{h1} Wh1、 b h 1 b_{h1} bh1、 W s m W_{sm} Wsm 和 b s m b_{sm} bsm,以及交叉熵后的结果。
6、随后进入SGD 训练,也就是反向传播的过程,从上往下计算每一层的参数,依次进行更新。
计算和更新的顺序为: b s m b_{sm} bsm, W s m W_{sm} Wsm, b h 1 b_{h1} bh1, W h 1 W_{h1} Wh1。
tensorflow的数据流图是由节点(node)和边(edge)组合而成的有向无环图(DAG)。TensorFlow是由Tensor和Flow两部分组成,Tensor(张量):数据流图中的边;Flow(流动):表示数据流图中节点所做的操作。
2.2.1 边
1、tensorflow的边有两种连接关系:数据依赖和控制依赖。
实线边:数据依赖,代表数据,即张量。任意维度的数据统称为张量。
虚线:控制依赖,可以用于控制操作的运行,这被用来确保happens-before 关系,这类边上没有数据流过,但源节点必须在目的节点开始执行前完成执行。常用代码如下:
tf.Graph.control_dependencies(control_inputs)
2、在机器学习算法中,张量在数据流图中从前往后流动一遍就完成了一次前向传播,而残差(残差是指实际观察值和训练的估计值之间的差)从后往前流动一遍就完成了一次反向传播。
tensorflow支持的张量所具有的的数据属性:
数据类型 | Python类型 | 描述 |
---|---|---|
DT_FLOAT | tf.float32 | 32位浮点型 |
DT_DOUBLE | tf.float64 | 64位浮点型 |
DT_INI64 | tf.int64 | 64位有符号整型 |
DT_INT16 | tf.int16 | 16位有符号整型 |
DT_INT8 | tf.int8 | 8位有符号整型 |
DT_IUINT8 | tf.uint8 | 8位无符号整型 |
DT_STRING | tf.string | 可变长度的字节数组,每一个张量元素都是一个字节数组 |
DT_BOOL | tf.bool | 布尔型 |
DT_COMPLEX64 | tfplex64 | 右两个32位浮点数组成的复数:实部和虚部 |
DT_QINT32 | tf.qint32 | 用于量化操作的32为有符号整型 |
DT_QINT8 | tf.qint8 | 用于量化操作的8位有符号整型 |
DT_QUINT32 | tf.quint32 | 用于量化操作的8位无符号整型 |
2.2.2 节点
图中的节点又称为算子,它代表一个操作(operation,OP),一般用来表示施加的数学运算,也可以表示数据输入(feed in)的起点以及输出(push out)的终点,或者是读取/写入持久变量(persistent variable)的终点。下表列举了一些TensorFlow 实现的算子。如下所示的算子支持表,所示的张量的各种数据属性,并且需要在建立图的时候确定下来。
算子:
1、数学运算
2、输入起点到输出终点
3、读取/写入持久变量的终点
类别 | 示例 |
---|---|
数学运算操作 | Add、Subtract、Multiply、Div、Exp、Log、Greater、Less、Equal… |
数组运算操作 | Concat、Slice、Split、Constant、Rank、Shape、Shuffle… |
矩阵运算操作 | MatMul、MatrixInverse、MatrixDeterminant… |
有状态的操作 | Variable、Assign、AssignAdd… |
神经网络构建操作 | SoftMax、Sigmoid、ReLu、Convolution2D、MaxPool… |
检查点操作 | Save、Restore |
队列和同步操作 | Enqueue、Dequeue、MutexAcquire、MutexRelease… |
控制张量流动的操作 | Merge、Switch、Enter、Leave、NextIteration |
2.3 其他概念
除了边和节点,TensorFlow还涉及一些其他的概率,如图、会话、设备、变量、内核等。
2.3.1 图
人家把操作任务描述成有向无环图。那么,如何来构建一个图那?构建图的第一步是创建各个节点。
import tensorflow as tf
#创建一个常量运算操作,产生一个1*2矩阵
matrix1 = tf.constant([[3.,3.]])# 创建灵位一个常量运算操作,产生一个2*1的矩阵
matrix2 = tf.constant([[2.],[2.]])# 创建一个矩阵乘法运算,吧matrix1和matrix2作为输入
# 返回值prodct代表矩阵乘法的结果
product = tf.matmul(matrix1,matrix2)
2.3.2 会话
之前也说了,启动图的第一步是创建一个Session对象。会话(session)提供在图中执行操作的一些方法。
一般的模式是:
1、建立会话,此时会生成一张空图
2、在会话中添加节点和边,形成一张图
3、然后执行
要创建一张图并运行操作的类,需要在python的API中使用tf.Session,当然在C++的API中使用tensorflow::Session
with tf.Session() as sess:result = sess.run(product)print(result) # 两个矩阵相乘,根据矩阵的特点,输出为一个数
1、在调用Session对象的run()方法来执行图时,传入一些Tensor,这个过程叫做填充(feed);返回的结果类型根据输入的类型而定,这个过程叫做取回(fetch)
2、会话是图交互的一个桥梁,一个会话可以有多张图,会话可以修改图的结构,也可以往图中注入数据进行计算。而在会话中有两个API接口:Extend和Run。Extend操作是在Graph中添加节点和边,Run操作是输入计算的节点和填充必要的数据后,进行计算,并输出运算结果。<.font>
2.3.3 设备
所谓的设备就是指可以用来运算并且拥有自己的地址空间的硬件资源,如:GPU和CPU。Tensorflow为了实现分布式执行操作,充分利用计算资源,可以明确指定操作在那个设备上执行。
with tf.Session() as sess:# 指定在第二个GPU上运行with tf.device("/gpu:1"):matrix1 = tf.constant([[3.,3.]])matrix2 = tf.constant([[2.],[2.]])# 返回值prodct代表矩阵乘法的结果product = tf.matmul(matrix1,matrix2)
2.3.4 变量
变量(varibale)是一个特殊的数据,它在图中有固定的位置,不能像普通张量那样可以流动。例如,创建一个变量张量,使用tf.Variable()构造函数,这个构造函数需要一个初始值,初始值的形状和类型决定了这个变量的形状和类型:
# 创建一个变量,初始值为标量0
state = tf.Variable(0,name="counter")
# 创建一个常量张量
input1 = tf.constant(3.0)
"""
tensorflow还提供了填充机制,可以在构建图时使用tf.placeholder()临时替代任意操作的张量,在调用Session对象的run()方法去执行图时,使用填充数据作为调用的参数,
调用结束后,填充数据就消失了"""
input1 = tf.placeholder(tf.float32)
input2 = tf.placeholder(tf.float32)
output = tf.multiply(input1,input2)
# 启动会话
with tf.Session() as sess:print(sess.run([output],feed_dict={input1: [7.], input2: [2.]}))
2.3.5 内核
首先,需要明确:操作(operation)是对抽象操作(如matmul 或者add)的一个统称,而内核(kernel)则是能够运行在特定设备(如CPU、GPU)上的一种对操作的实现。因此,同一个操作可能会对应多个内核。其次,当自定义一个操作时,需要把新操作和内核通过注册的方式添加到系统中。
关于内核更多的知识,博主也没时间去更详细的介绍了,在此就不多说了,想更输入可检索,一般都有的。接下来我们来看看在tensorflow中一些常用的API
2.4 常用API
此小结,主要学习一些python的API
2.4.1 图、操作和张量
TensorFlow 的计算表现为数据流图,所以tf.Graph 类中包含一系列表示计算的操作对象(tf.Operation),以及在操作之间流动的数据—张量对象(tf.Tensor)。与图相关的API 均位于
tf.Graph 类中,具体可如下表所示:
操作 | 描述 |
---|---|
tf.Graph__init__() | 将某图设置为默认图,并返回一个上下文管理器。如果不显示添加一个默认图,系统会自动设置一个全局的默认图。所设置的默认图,在模块范围内定义的节点都将默认加入默认图中。 |
tf.Graph.device(device_name_or_function) | 定义运行图所使用的设备,并返回一个上下文管理器 |
tf.Graph.name_space(name) | 为节点创建层次化的名称,并返回一个上下文管理器 |
tf.Operation 类代表图中的一个节点,用于计算张量数据。该类型由节点构造器(如tf.matmul()或者Graph.create_op())产生。例如,c = tf.matmul(a, b)创建一个Operation 类,其类型为MatMul的操作类。与操作相关的API 均位于tf.Operation 类中,具体如下表:
操作 | 描述 |
---|---|
tf.Operation.name | 操作的名称 |
tf.Operation.type | 操作的类型,如MatMul |
tf.Operation.inputs;tf.Operation.outputs | 操作的输入和输出 |
tf.Operation.control_inputs | 操作的依赖 |
tf.Operation.run(feed_dict=None,session=None) | 在会话中运行该操作 |
tf.Operation.get_attr(name) | 获取操作的属性值 |
tf.Tensor 类是操作输出的符号句柄,它不包含操作输出的值,而是提供了一种在tf.Session中计算这些值的方法。这样就可以在操作之间构建一个数据流连接,使TensorFlow 能够执行一个表示大量多步计算的图形。与张量相关的API 均位于tf.Tensor 类中,如下表:
操作 | 描述 |
---|---|
tf.Tensor.dtype | 张量的数据类型 |
tf.Tensor.name | 张量的名称 |
tf.Tensor.value_index | 张量在操作输出中的索引 |
tf.Tensor.graph | 张量所在的图 |
tf.Tensor.op | 产生该张量的操作 |
tf.Tensor.cinsumers() | 返回使用该张量的操作列表 |
tf.Tensor.eval(feed_dict=None,session=None) | 在会话中求张量的值,使用sess.as_default()或者eval(session=sess) |
tf.Tensor.get_shape() | 返回用于标识张量的形状(维度)的类TensorShape |
tf.Tensor.set_shape(shape) | 更新张量的形状 |
tf.Tensor.device | 设置计算该张量的设备 |
2.4.1 可视化
1、前面我们简单介绍了在神经网络中使用的可视化工具,但是,如何变成可视化程序那?可视化时,需要在程序中给必要的节点添加摘要(summary),摘要会收集该节点的数据,并标记上第几步,时间戳等标识,写入事件文件(event file)中。
2、tf.summary.FileWriter类用于在目录中创建事件文件,并且想文件中添加摘要和事件,用来在TenSorBoard中展示,具体常用的可视化API操作如下表所示:
API | |
---|---|
tf.summary.FileWriter.init(logdir, graph=None, max_queue=10, flush_secs=120, graph_def=None) | 创建FileWriter 和事件文件,会在logdir中创建一个新的事件 |
tf.summary.FileWriter.add_graph(graph, global_step=None, graph_def=None) | 向事件文件中添加一个图 |
tf.summary.FileWriter.get_logdir() | 获取事件文件的路径 |
tf.summary.FileWriter.flush() | 将所有事件都写入磁盘 |
tf.summary.FileWriter.close() | 将事件写入磁盘,并关闭文件操作符 |
tf.summary.scalar(name, tensor, collections=None) | 输出包含单个标量值的摘要 |
tf.summary.histogram(name, values, collections=None) | 输出包含直方图的摘要 |
tf.summary.audio(name, tensor, sample_rate, max_outputs=3,collections=None) | 输出包含音频的摘要 |
tf.summary.image(name, tensor, max_outputs=3, collections= None) | 输出包含图片的摘要 |
tf.summary.merge(inputs, collections=None, name=None) | 合并摘要,包含所有输入摘要的值 |
写在后面:我们就先介绍到这里,一篇博文如果够长,我相信大佬您也没有耐心看了,关于tensorflow的学习真的是一个任重而道远的一个过程,博主将在下片博文:【深度学习】Tensoflow的一些基础介绍(二)中继续介绍有关于tensorflow的一些基础学习。
更多推荐
【深度学习】Tensoflow的一些基础介绍(一)
发布评论