说明:本文实例使用Python版本为3.5.6,Tensorflow版本为2.0前端
Tensorflow是Google推出的机器学习开源神器,对Python有着良好的语言支持,支持CPU,GPU和Google TPU等硬件,而且已经拥有了各类各样的模型和算法。目前,Tensorflow已被普遍应用于文本处理,语音识别和图像识别等多项机器学习和深度学习领域。python
分为三层:应用层、接口层和核心层git
应用层github
提供了机器学习相关的训练库、预测库和针对Python、C++和Java等变成语言的编程环境,相似于web系统的前端,主要实现了对计算图的构造。web
接口层算法
对Tensorflow功能模块的封装,便于其它语言平台的调用。编程
核心层数组
最重要的部分,包括设备层、网络层、数据操做层和图计算层,执行应用层的计算。网络
包括Tensorflow在不一样硬件设备上的实现,主要支持CPU、GPU和Mobile等设备,在不一样硬件设备上实现计算命令的转换,给上层提供统一的接口,实现程序的跨平台功能。session
网络层主要包括RPC和RDMA通讯协议,实现不一样设备之间的数据传输和更新,这些协议都会在分布式计算中用到。
以tensor为处理对象,实现tensor的各类操做和计算。
包括分布式计算图和本地计算图的实现,实现图的建立、编译、优化和执行等。
能够将Tensorflow理解为一张计算图中“张量的流动”,其中,Tensor(张量)表明了计算图中的边,Flow(流动)表明了计算图中节点所作的操做而造成的数据流动。
其设计理念是以数据流为核心,当构建相应的机器学习模型后,使用训练数据在模型中进行数据流动,同时将结果以反向传播的方式反馈给模型中的参数,以进行调参,使用调整后的参数对训练数据再次进行迭代计算。
有两个编程特色:
在tensorflow中,须要预先定义各类变量,创建相关的数据流图,在数据流图中建立各类变量之间的计算关系,完成图的定义,须要把运算的输入数据放进去后,才会造成输出值。
tensorflow的相关计算在图中进行定义,而图的具体运行坏境在会话(session)中,开启会话后,才能开始计算,关闭会话就不能再进行计算了。
举个例子:
import tensorflow as tf tf.compat.v1.disable_eager_execution() a = 3 b = 4 c = 5 y = tf.add(a*b, c) print(y) a = tf.constant(3, tf.int32) b = tf.constant(4, tf.int32) c = tf.constant(5, tf.int32) y = tf.add(a*b, c) print(y) session = tf.compat.v1.Session() print(session.run(y)) session.close()
能够看出,在图建立后,并在会话中执行数据计算,最终输出结果。
设计的好处就是:学习的过程当中,消耗最多的是对数据的训练,这样设计的话,当进行计算时,图已经肯定,计算就只剩下一个不断迭代的过程。
张量,是tensorflow中最主要的数据结构,张量用于在计算图中进行数据传递,建立了张量后,须要将其赋值给一个变量或占位符,以后才会将该张量添加到计算图中。
会话,是Tensorflow中计算图的具体执行者,与图进行实际的交互。一个会话中能够有多个图,会话的主要目的是将训练数据添加到图中进行计算,也能够修改图的结构。
调用模式推荐使用with语句:
with session: session.run()
变量,表示图中的各个计算参数,经过调整这些变量的状态来优化机器学习算法。建立变量应使用tf.Variable(),经过输入一个张量,返回一个变量,变量声明后需进行初始化才能使用。
举例说明:
import tensorflow as tf tf.compat.v1.disable_eager_execution() tensor = tf.ones([1, 3]) test_var = tf.Variable(tensor) # 初始化变量 init_op = tf.compat.v1.global_variables_initializer() session = tf.compat.v1.Session() with session: print("tensor is ", session.run(tensor)) # print("test_var is ", session.run(test_var)) session.run(init_op) print("after init, test_var is", session.run(test_var))
占位符,用于表示输入输出数据的格式,声明了数据位置,容许传入指定类型和形状的数据,经过会话中的feed_dict参数获取数据,在计算图运行时使用获取的数据进行计算,计算完毕后获取的数据就会消失。
举例说明:
x = tf.compat.v1.placeholder(tf.int32) y = tf.compat.v1.placeholder(tf.int32) z = tf.add(x, y) session = tf.compat.v1.Session() with session: print(session.run([z], feed_dict={x: [1, 2], y: [2, 3]}))
操做,是图中的节点,输入输出都是Tensor,做用是完成各类操做,包括:
队列,图中有状态的节点。包含入列(endqueue)和出列(dequeue)两个操做,入列返回计算图中的一个操做节点,出列返回一个tensor值。
其中,队列有两种:
1. FIFOQueue
按入列顺序出列的队列,在须要读入的训练样本有序时使用。举个例子:
fifo_queue = tf.compat.v1.FIFOQueue(10, 'int32') init = fifo_queue.enqueue_many(([1, 2, 3, 4, 5, 6], )) with tf.compat.v1.Session() as session: session.run(init) queue_size = session.run(fifo_queue.size()) for item in range(queue_size): print('fifo_queue', session.run(fifo_queue.dequeue()))
2. RandomShuffleQueue
以随机顺序出列的队列,读入的训练样本无序时使用。举个例子:
rs_queue = tf.compat.v1.RandomShuffleQueue(capacity=5, min_after_dequeue=0, dtypes='int32') init = rs_queue.enqueue_many(([1, 2, 3, 4, 5], )) with tf.compat.v1.Session() as session: session.run(init) queue_size = session.run(rs_queue.size()) for i in range(queue_size): print('rs_queue', session.run(rs_queue.dequeue()))
代码参考:my github
以上。