Tensorflow学习笔记(一)

TF的编程模型

来源:http://blog.csdn.net/tinyzhao/article/details/52755647

计算图

在TensorFlow中,算法都被表示成计算图(computational graphs)。计算图也叫数据流图,图中的节点表示操作,图中的边代表在不同操作之间的数据流动。
在这样的数据流图中,有四个主要的元素概念:

  • 操作(operations)
  • 张量(tensors)
  • 变量(variables)
  • 会话(sessions)

    操作(operations)

    数据流过节点的时候对数据进行的操作,操作包含很多种。
操作类型 例子
元素运算 Add,Mul
矩阵运算 MatMul,MatrixInverse
数值产生 Constant,Variable
神经网络单元 SoftMax,ReLU,Conv2D
I/O Save,Restore

张量(tensors)

图中的每个边代表数据从一个操作流到另一个操作。这些数据被表示为张量。一个张量可以看做是多维的数组或者高维的矩阵。
张量本身并没有保存任何值,张量仅仅提供了访问数值的一个接口,可以看做是数值的一种引用。在TensorFlow实际使用中我们也可以发现,在run之前的张量并没有分配空间,此时的张量仅仅表示了一种数值的抽象,用来连接不同的节点,表示数据在不同操作之间的流动。
TensorFlow中还提供了SparseTensor数据结构,用来表示稀疏张量。

变量(variables)

可以改变数值和数据类型的节点。在实际处理时,一般把需要训练的值指定为变量。在使用变量的时候,需要指定变量的初始值,变量的大小和数据类型就是根据初始值来推断的。
在构建计算图的时候,指定一个变量实际上需要增加三个节点:

  • 实际的变量节点
  • 一个产生初始值的操作,通常是一个常量节点
  • 一个初始化操作,把初始值赋予到变量

a
如图所示,v代表的是实际的变量,i是产生初始值的节点,上面的assign节点将初始值赋予变量,assign操作以后,产生已经初始化的变量值v’。

tensorflow的基本运作方式

1
2
3
4
5
6
7
8
9
10
11
12
13
#coding=utf-8
import tensorflow as tf
#定义占位符
a = tf.placeholder(tf.int32,shape=())
b = tf.placeholder(tf.int32,shape=())
#构建运算图
y = tf.multiply(a, b) #构造一个op节点
#创建会话
sess = tf.Session()
#运行会话,输入数据,并计算节点,同时打印结果
print(sess.run(y, feed_dict={a: 3, b: 3}))
# 任务完成, 关闭会话.
sess.close()

TF的运行流程

来源:http://www.cnblogs.com/wuzhitj/p/6297734.html

概念描述

Tensor

在训练开始前,所有的数据都是抽象的概念

1
2
3
4
import tensorflow as tf # 在下面所有代码中,都去掉了这一行,默认已经导入
a = tf.zeros(shape=[1,2])
print(a)
#Tensor("zeros:0", shape=(1, 2), dtype=float32)

只有在训练过程开始后,才能获得a的实际值

1
2
3
sess = tf.InteractiveSession()
print(sess.run(a))
#[[ 0. 0.]]

Variable

故名思议,是变量的意思,与Tensor不同,Variable必须初始化以后才有具体的值

1
2
3
4
5
6
7
tensor = tf.zeros(shape=[1,2])
variable = tf.Variable(tensor)
sess = tf.InteractiveSession()
# print(sess.run(variable)) # 会报错
sess.run(tf.initialize_all_variables()) # 对variable进行初始化
print(sess.run(variable))
#[[ 0. 0.]]

placeholder

又叫占位符,同样是一个抽象的概念。用于表示输入输出数据的格式。告诉系统:这里有一个值/向量/矩阵,现在我没法给你具体数值,不过我正式运行的时候会补上的!例如上式中的x和y。因为没有具体数值,所以只要指定尺寸即可。

1
2
x = tf.placeholder(tf.float32,[1, 5],name='input')
y = tf.placeholder(tf.float32,[None, 5],name='input')

上面有两种形式,第一种x,表示输入是一个[1,5]的横向量。
而第二种形式,表示输入是一个[?,5]的矩阵。那么什么情况下会这么用呢?就是需要输入一批[1,5]的数据的时候。比如我有一批共10个数据,那我可以表示成[10,5]的矩阵。如果是一批5个,那就是[5,5]的矩阵。tensorflow会自动进行批处理

Session

session,也就是会话。session是抽象模型的实现者。只有实现了模型以后,才能够得到具体的值。