一、基本知识
TensorFlow的基本知识是学习的基础,要有一个大致的了解。这个学习的时候遇到很多问题,所以准备一边学习一边整理。这些内容主要来自TensorFlow的中文社区,再加上自己的一些整理。
首先要了解TensorFlow的基本概念。tensor可以理解为一种数据,TensorFlow就相当于一个数据的流动过程,所有能用图(graph)来表示的计算任务理论上都能用TensorFlow 来实现。有图就有节点和边的概念,其中节点是一种操作(如加减乘除)被称为operation简称op,一个节点可以连接很多边,而边上传递的数据就是tensor。为了能够实现一个计算流程就需要一个graph来表示这个流程,而为了能够执行这个图就需要一个会话(Session)来启动这个图,这个过程相当于graph是画好的一张图,然后我用一个Session来执行这个图。
由上面的过程就可以知道,想要实现一个计算就需要先画好一张图(graph),然后就是需要一个会话(Session)来启动这个图,然后通过Session的run()方法来计算图中需要计算的的值。最后就是对计算得到的值进行一些评估(这个比较复杂)。
过程就是:建图->启动图->运行取值
二、必用内容介绍
1、tensor之———变量(variable)、常量(constant)、占位符(Placeholder)
这里就是我们会用到的一些计算量,这些都可以看成一种tensor,其实这些内容和大部分语言中的计算量的概念是一样的。
(1)变量
其中variable是可变的量,通常保存一些在计算中需要更新的量,如神经网络的参数等。官方描述是:当训练模型时,用变量来存储和更新参数。变量包含张量 (Tensor)存放于内存的缓存区。建模时它们需要被明确地初始化,模型训练后它们必须被存储到磁盘。这些变量的值可在之后模型训练和分析是被加载。
①创建的实现方式如下
x = tf.Variable(a)
其中a是一个numpy中类型的ndarray(所有的tensor都是),这里的a相当于对x进行了初始化。
②初始化方法如下
初始化方式通常有两种,一种是所有变量一起初始化,一种是分别初始化。首先所有变量一起初始化使用tf.initialize_all_variables() 。还有一种是分别初始化tf.initialize_variables(var_list, name='init'),其中var_list是待初始化的变量列表,全部初始化就等价于initialize_variables(all_variables())。这里注意,这两个函数的返回值都是Operation,需要在Session中run()才能初始化。
而实际上初始化还有几种情况,如:对于变量而言还有一个方法是variable.initialized_value()可以返回初始化的值,在用其它变量的值初始化一个新的变量时,使用其它变量的initialized_value()属性。你可以直接把已初始化的值作为新变量的初始值,或者把它当做tensor计算得到一个值赋予新变量。
# Create a variable with a random value.
weights = tf.Variable(tf.random_normal([784, 200], stddev=0.35),
name="weights")
# Create another variable with the same value as 'weights'.
w2 = tf.Variable(weights.initialized_value(), name="w2")
# Create another variable with twice the value of 'weights'
w_twice = tf.Variable(weights.initialized_value() * 0.2, name="w_twice")
而且每一个变量还有一个tf.Variable.initializer的方法进行单个的初始化,这些内容在API中都有介绍。
(2)constant就是常量,这个不需要多解释
a = tf.constant([3.0, 3.0])
(3)Placeholder
这个最能体现TensorFlow的优势,TensorFlow首先都是搭建一个图然后描述一下操作,而占位符就是先占住一个位置因为我们不知道输入的数量等一些具体信息,所以可以先大致的描述一下这一信息。
x = tf.placeholder(tf.float32, [None, 784])
因为我们不知道x的具体数量,所以可以用None来代替【None, 784】就是我不知道数量但是我知道它的维度为784。“float”是x的精度,这个在官方文档中有详细的介绍,可以用下面链接中的数据类型。
2、Session的简介
前面已经说过了Session就是一个会话,是用来运行一个图用的,按照官方API中的说法:一个Session的目标简单说就是operation(op)的执行和tensor的计算。例如一种最简单的op(常量乘法)的执行如下:
# Build a graph.
a = tf.constant(5.0)b = tf.constant(6.0)c = a * b# Launch the graph in a session.sess = tf.Session()# Evaluate the tensor `c`.print sess.run(c)
一个Session可以拥有很多资源(resources),还可以有变量、队列和reader,所以每次运行完一个Session都要用.cloce()关闭会话,这有两种方法:
# 方法一 Using the `close()` method.
sess = tf.Session()
sess.run(...)
sess.close()
# 方法2 Using the context manager.
with tf.Session() as sess:
sess.run(...)
这里我们需要知道,一个计算其实可以有很多graph的,所以我们的Session需要加载一个graph,而通常我们只是加载的默认graph。Session的构造函数很有意思:
__init__(target='', graph=None, config=None) 这三个参数都是可选项,具体内容看上面提过的API。
3、Session中run的使用以及fetch和feed
上面我们用了一个Session的方法run(),这里详细的介绍一下run的使用方法。其作用是Runs operations and evaluates tensors in fetches,意思是执行一次Session,其中待执行的内容放在fetches中,这里的fetches是一个有用的概念,在其他地方也用得到。目前暂时看成是一些待计算的内容。我们看一下run需要的参数:
run(fetches,feed_dict=None,options=None,run_metadata=None)
首先介绍一下fetch,fetches可以是一个图中的element(元素),或者一些list、tuple、namedtuple, dict, or OrderedDict containing graph elements at its leaves,总之就是一般结构都可以。而这个element可以是下面几种类型:
- Operation,这时返回值是None
- Tensor,则返回计算得到的Tensor中包含的值
- SparseTensor,和上面的一样
- string,这时string为Operation或Tensor的名字,返回内容和上面一致。
接着介绍feed_dict,feed_dict允许override(重写)图中tensor的值,顾名思义feed_dict是一个字典,键是tensor的名字,值是重写的tensor的内容。通常用在Placeholder的实现上。
4、交互式的Session
tf.InteractiveSession()主要用于Ipython这种交互场景下,它和标准的Sessin的唯一区别就是它初始化自己是default的Session。
这里就要提一下什么是default session。这个在标准Session中是用下面这个方法实现的:tf.Session.as_default(), 它返回了一个context manager(姑且称为上下文管理器)来将这个Session变为default session,在使用with关键字的时候,就可以在Session中直接执行operation.run()或tensor.eval()两个类型的命令(原文是:Use with the with keyword to specify that calls to tf.Operation.run or tf.Tensor.eval should be executed in this session.)。
我个人是这么理解的,对于一个graph结构,可以在不同的Session中运行,在运行过程中必须指定运行的Session是哪个,所以平时运行图的时候要用Session.run(元素)的形式来进行,但是用with sess.as_default()进行时其下内容都是在这个sess中运行的对话,所以可以直接用元素的.eval()或run()来直接运行了。
c = tf.constant(...)
sess = tf.Session()
with sess.as_default():
print c.eval()
# ...
with sess.as_default():
print c.eval()
sess.close()
tf.InteractiveSession()就直接实现了上面的功能:
# 进入一个交互式 TensorFlow 会话.
import tensorflow as tf
sess = tf.InteractiveSession()
x = tf.Variable([1.0, 2.0])
a = tf.constant([3.0, 3.0])
# 使用初始化器 initializer op 的 run() 方法初始化 'x'
x.initializer.run()
# 增加一个减法 sub op, 从 'x' 减去 'a'. 运行减法 op, 输出结果
sub = tf.sub(x, a)
print (sub.eval())
---------------------------------------------------------------------------------------------------------
原文:https://blog.csdn.net/woaidapaopao/article/details/72863591