TensorFlow之基础知识

原创博客,转载请注明出处!

0、基本流程

  • 使用张量表示数据.
  • 使用图 (graph) 来表示计算任务
  • 使用会话(Session)来执行图
  • 使用fetch取回数据,feed为操作赋值

 

下面我们一步步分析

首先导入包,tensorflow通常简称为tf

import tensorflow as tf

 

1、张量(tensor)

张量是tensorflow框架使用的基本的数据机构,张量其实就是多维数组,在python中可以理解为嵌套的多维列表。张量的维度称为阶,0阶张量又称为标量,1阶张量又称为向量,2阶张量又称为矩阵

3 # 0阶张量,标量
[1., 2., 3.] # 1阶张量,向量大小为3
[[1., 2., 3.], [4., 5., 6.]] # 2阶张量,两行三列的矩阵
[[[1., 2.],[3., 4.],[5., 6.]], [[7., 8.],[9., 10.],[11., 12.]]] # 3阶张量,大小为2*3*2

 

2、常量(constant)与变量(variable)

tensorflow中用tf.constant创建常量,如:

c1 = tf.constant([[3., 3.]])#创建一个一行两列的矩阵常量,其值均为3
c2 = tf.constant([[2.],[2.]])#创建一个两行一列的矩阵常量,其值均为2

变量(Variable)是特殊的张量(Tensor),它的值可以是一个任何类型和形状的张量,用tf.Variable创建变量,如:

state = tf.Variable(0, name="counter")#创建一个0阶变量并初始化为0

创建变量的时候必须将一个张量作为初始值传入构造函数Variable(),TensorFlow提供了一系列操作符来初始化张量如tf.random_normaltf.zeros

#用一个形状(2,)的张量(2维向量)去初始化一个变量
v = tf.Variable([20,30],name="v")
#用标准差为0.35的正太分布初始化一个形状(10,20)的变量
w = tf.Variable(tf.random_normal([10, 20], stddev=0.35),
                      name="w")
#用一个形状为(20,)的张量(里面的元素值全部为0的20维向量)去初始化一个变量
b = tf.Variable(tf.zeros([20]), name="b")

附:tf.truncated_normal和tf.random_normal一样都是生成正态分布随机数,不同是前者去除边缘值

 

3、计算图(computational graph)和会话(session)

TensorFlow 使用来表示计算的任务,即图描述了计算的过程,图中的节点被称之为 op (operation 的缩写),一个节点(op)接受0或多个张量作为输入,然后产生0个或多个张量作为输出。

此外,图必须在会话里被启动,会话将图的 op 分发到 CPU 或 GPU 之类的 设备上,同时提供执行 op 的方法,这些方法执行后,将产生的 tensor 返回.,在 Python 中,返回的 tensor 是 numpy ndarray 对象; 在 C 和 C++ 语言中,返回的 tensor 是 tensorflow::Tensor 实例。

TensorFlow 程序通常被组织成一个构建阶段和一个执行阶段,在构建阶段,op 的执行步骤被描述成一个图; 在执行阶段, 使用会话执行执行图中的 op。例如通常在构建阶段创建一个图来表示和训练神经网络,然后在执行阶段反复执行图中的训练 op。

 

(1)构建图(构建阶段)

构建图的第一步是创建op (source op),源 op 不需要任何输入,例如常量 (Constant),源 op 的输出被传递给其它 op 做运算。

在python中,op 构造器的返回值代表被构造出的 op 的输出,这些返回值可以传递给其它 op 构造器作为输入。

TensorFlow Python 库有一个默认图 (default graph),op 构造器可以为其增加节点:

import tensorflow as tf

# 创建一个常量 op, 产生一个 1x2 矩阵. 这个 op 被作为一个节点
# 加到默认图中.
#
# 构造器的返回值代表该常量 op 的返回值.
matrix1 = tf.constant([[3., 3.]])

# 创建另外一个常量 op, 产生一个 2x1 矩阵.
matrix2 = tf.constant([[2.],[2.]])

# 创建一个矩阵乘法 matmul op , 把 'matrix1' 和 'matrix2' 作为输入.
# 返回值 'product' 代表矩阵乘法的结果.
product = tf.matmul(matrix1, matrix2)

默认图现在有三个节点,两个 constant() op和一个matmul() op,注意此时只是定义好了计算的方式,还没有真正的计算,为了真正进行矩阵相乘运算,并得到矩阵乘法的结果,你必须在下面说的会话里启动这个图。

 

(2)在一个会话中启动图(执行阶段)

启动图的第一步是创建一个 Session 对象,如果无任何创建参数,会话构造器将启动默认图:

# 启动默认图.
sess = tf.Session()

# 调用 sess 的 'run()' 方法来执行矩阵乘法 op, 传入 'product' 作为该方法的参数. 
# 上面提到, 'product' 代表了矩阵乘法 op 的输出, 传入它是向方法表明, 我们希望取回
# 矩阵乘法 op 的输出.
#
# 整个执行过程是自动化的, 会话负责传递 op 所需的全部输入. op 通常是并发执行的.
# 
# 函数调用 'run(product)' 触发了图中三个 op (两个常量 op 和一个矩阵乘法 op) 的执行.
#
# 返回值 'result' 是一个 numpy `ndarray` 对象.
result = sess.run(product)
print result
# ==> [[ 12.]]

# 任务完成, 关闭会话.
sess.close()

Session 对象在使用完后需要关闭以释放资源,除了显式调用 close 外,也可以使用 "with" 代码块来自动完成关闭动作。

with tf.Session() as sess:
  result = sess.run([product])
  print result

 

为了取回张量(输出值),在Session的run()调用执行时传入张量,在刚刚的例子中,我们只取回了单个节点product,你也可以取回多个张量。需要获取的多个 tensor 值,在 op 的一次运行中一起获得(而不是逐个去获取 tensor)。

input1 = tf.constant(3.0)
input2 = tf.constant(2.0)
input3 = tf.constant(5.0)
intermed = tf.add(input2, input3)
mul = tf.mul(input1, intermed)

with tf.Session():
  result = sess.run([mul, intermed])
  print result

# 输出:
# [array([ 21.], dtype=float32), array([ 7.], dtype=float32)]

 

4、占位符

上述示例在计算图中引入了张量,以常量或变量的形式存储,tensorflow中还提供另外一种机制,即先定义占位符,等到真正执行的时候再用具体值去填充或更新占位符的值

tf.placeholder()创建占位符,Session.runfeed_dict参数填充值。

input1 = tf.placeholder(tf.types.float32)
input2 = tf.placeholder(tf.types.float32)
output = tf.mul(input1, input2)

with tf.Session() as sess:
  print sess.run([output], feed_dict={input1:[7.], input2:[2.]})

# 输出:
# [array([ 14.], dtype=float32)]

 

参考:http://www.tensorfly.cn/tfdoc/get_started/basic_usage.html

 

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值