关于Tensorflow计算图与Tensor的理解

原创 2017年04月23日 14:51:20

关于Tensorflow计算模型

tensorflow的编程和我以往接触的编程方式有很大差异。以前的编程,无论是编译类型的语言还是脚本语言,都是一步一步的,变量计算后,就会得到结果,比如c=a+b,当执行完语句后,就会得到c的值。但tensorflow不是,它首先要通过编程,构建一个计算图出来,然后启用一个会话来把数据作为输入,通过这个图规定的计算步骤计算,最后得到结果。
普通的命令式编程容易理解和调试,命令语句基本没有优化,按原有逻辑执行。tensorflow这种符号式编程有较多的嵌入和优化,不容易理解和调试,但运行速度会有一定的提升。

Tensor张量

Tensor是Tensorflow中一个很重要的概念,它定义了计算的规则而不保存计算的数据,是构建计算图不可或缺的重要组成部分。首先看一下官方文档的介绍:

A Tensor is a symbolic handle to one of the outputs of an Operation. It does not hold the values of that operation’s output, but instead provides a means of computing those values in a TensorFlow tf.Session.

This class has two primary purposes:
A Tensor can be passed as an input to another Operation. This builds a dataflow connection between operations, which enables TensorFlow to execute an entire Graph that represents a large, multi-step computation.
After the graph has been launched in a session, the value of the Tensor can be computed by passing it to tf.Session.run. t.eval() is a shortcut for calling tf.get_default_session().run(t).

上面简单来说,Tensor是一个代表计算操作的句柄,它不保存数据,只是提供一个计算数据的方法。使用Tensor主要有两个目的,一个是Tensor可以把不同的操作连接起来,从而去构建一个计算图,支持Tensorflow去进行大规模多步的计算,另一个是当Tensor被一个会话Session启用的时候,就可以计算出该操作对应产出的数据。

可以说,Tensorflow计算的过程就是利用的Tensor来建立一个计算图,然后使用Session会话来启动计算,最后得到结果的过程。

简单的验证代码

写了一点代码来验证一下上面的说法。

import tensorflow as tf

def prn_obj(obj):
    print '\n'.join(['%s:%s' % item for item in obj.__dict__.items()])

def run():
    g1 = tf.Graph()
    with g1.as_default():
        a = tf.Variable(tf.random_normal([2,3],stddev=0.35,name='a'))
        b = tf.Variable(tf.random_normal([2,3],stddev=0.35,name='b'))
        c = a + b
        d = tf.reduce_max([b,c],0)
        e = tf.reduce_max([a,c],0)
        f = tf.reduce_max([d,e],0)
        print 'a:----------------------------------------'
        prn_obj(a)
        print 'b:----------------------------------------'
        prn_obj(b)
        print 'c:----------------------------------------'
        print prn_obj(c)
        print 'd:----------------------------------------'
        print prn_obj(d)
        print 'e:----------------------------------------'
        print prn_obj(e)
        print 'f:----------------------------------------'
        print prn_obj(f)

run()

下面是结果,可以看到,Tensor中并没有实际的数据,a和b是变量,先不看。以c为例说一下,c是一个Tensor,有几个需要注意的属性:
- op: “Add” 规定了操作的类型
- _shape:(2, 3) 规定了需求数据的shape
- _dtype:dtype: ‘float32’ 规定了需求数据的类型
- _consumers:[tf.Operation ‘Max/input’ type=Pack, tf.Operation ‘Max_1/input’ type=Pack] consumers,字面意思也就是消费者,记录了以该Tensor的计算结果作为输入的下一步计算的Tensor

了解Tensor是一个什么东西对于tensorflow的编程还是很有好处很有必要的,由于tensorflow首先要建立一个计算图,一定要对每个操作的输入输出的概念有一个清晰的认识才能在编程中不迷糊。

a:----------------------------------------
_variable:Tensor("Variable:0", shape=(2, 3), dtype=float32_ref)
_initial_value:Tensor("a:0", shape=(2, 3), dtype=float32)
_save_slice_info:None
_caching_device:None
_snapshot:Tensor("Variable/read:0", shape=(2, 3), dtype=float32)
_initializer_op:name: "Variable/Assign"
op: "Assign"
input: "Variable"
input: "a"
attr {
  key: "T"
  value {
    type: DT_FLOAT
  }
}
attr {
  key: "_class"
  value {
    list {
      s: "loc:@Variable"
    }
  }
}
attr {
  key: "use_locking"
  value {
    b: true
  }
}
attr {
  key: "validate_shape"
  value {
    b: true
  }
}

b:----------------------------------------
_variable:Tensor("Variable_1:0", shape=(2, 3), dtype=float32_ref)
_initial_value:Tensor("b:0", shape=(2, 3), dtype=float32)
_save_slice_info:None
_caching_device:None
_snapshot:Tensor("Variable_1/read:0", shape=(2, 3), dtype=float32)
_initializer_op:name: "Variable_1/Assign"
op: "Assign"
input: "Variable_1"
input: "b"
attr {
  key: "T"
  value {
    type: DT_FLOAT
  }
}
attr {
  key: "_class"
  value {
    list {
      s: "loc:@Variable_1"
    }
  }
}
attr {
  key: "use_locking"
  value {
    b: true
  }
}
attr {
  key: "validate_shape"
  value {
    b: true
  }
}

c:----------------------------------------
_op:name: "add"
op: "Add"
input: "Variable/read"
input: "Variable_1/read"
attr {
  key: "T"
  value {
    type: DT_FLOAT
  }
}

_shape:(2, 3)
_value_index:0
_handle_shape:unknown_rank: true

_dtype:<dtype: 'float32'>
_consumers:[<tf.Operation 'Max/input' type=Pack>, <tf.Operation 'Max_1/input' type=Pack>]
_handle_dtype:0
None
d:----------------------------------------
_op:name: "Max"
op: "Max"
input: "Max/input"
input: "Max/reduction_indices"
attr {
  key: "T"
  value {
    type: DT_FLOAT
  }
}
attr {
  key: "Tidx"
  value {
    type: DT_INT32
  }
}
attr {
  key: "keep_dims"
  value {
    b: false
  }
}

_shape:(2, 3)
_value_index:0
_handle_shape:unknown_rank: true

_dtype:<dtype: 'float32'>
_consumers:[<tf.Operation 'Max_2/input' type=Pack>]
_handle_dtype:0
None
e:----------------------------------------
_op:name: "Max_1"
op: "Max"
input: "Max_1/input"
input: "Max_1/reduction_indices"
attr {
  key: "T"
  value {
    type: DT_FLOAT
  }
}
attr {
  key: "Tidx"
  value {
    type: DT_INT32
  }
}
attr {
  key: "keep_dims"
  value {
    b: false
  }
}

_shape:(2, 3)
_value_index:0
_handle_shape:unknown_rank: true

_dtype:<dtype: 'float32'>
_consumers:[<tf.Operation 'Max_2/input' type=Pack>]
_handle_dtype:0
None
f:----------------------------------------
_op:name: "Max_2"
op: "Max"
input: "Max_2/input"
input: "Max_2/reduction_indices"
attr {
  key: "T"
  value {
    type: DT_FLOAT
  }
}
attr {
  key: "Tidx"
  value {
    type: DT_INT32
  }
}
attr {
  key: "keep_dims"
  value {
    b: false
  }
}

_shape:(2, 3)
_value_index:0
_handle_shape:unknown_rank: true

_dtype:<dtype: 'float32'>
_consumers:[]
_handle_dtype:0
None

tensorflow入门(三)---tensorflow的计算图和tensor

tensorflow程序通常被组织成一个图的构建和图的执行阶段,例如我们搭建一个神经网络,组织各个层及之间关系的过程称为图的构建,然后通过不断反复的执行图中的训练op来逐渐优化参数。在图的构建阶段,就...

TensorFlow 学习(四)—— computation graph

TensorFlow 的计算需要事先定义一个 computation graph(计算图),该图是一个抽象的结构,只有在评估(evaluate)时,才有数值解,这点和 numpy 不同。这张图由一组节...

Tensorflow计算模型 —— 计算图

Tensorflow计算模型 —— 计算图Tensorflow是一个通过计算图的形式来表述计算的编程系统,计算图也叫数据流图,可以把计算图看做是一种有向图,Tensorflow中的每一个计算都是计算图...

Tensorflow lesson 3---变量Variable

Tensorflow中的变量就是一个放在内存中的tensor结构,用于在计算过程中保存数据,变量的数值可以保存到文件中,也可以从文件中读取1.变量的初始化import tensorflow as tf...
  • mwlwlm
  • mwlwlm
  • 2017年05月10日 14:33
  • 676

tensorflow saver 保存和恢复指定 tensor

在实践中经常会遇到这样的情况: 1, 用简单的模型预训练参数 2, 把预训练的参数导入复杂的模型后训练复杂的模型 这时就产生一个问题:                 如何加载预训练的参数。 下面就是...

[Tensorflow]tensor 数学运算和逻辑运算

一、arthmetic 算术操作(+,-,*,/,Mod) #运算规则:element-wise。即c[i,j,..,k]=a[i,j,..,k] op b[i,j,..,k] #两个tensor 运...
  • vcvycy
  • vcvycy
  • 2017年11月09日 14:59
  • 126

为什么Tensorflow需要使用"图计算"来表示计算过程

今天一个同学问我,在tensorflow里面是图? 我跟他说: (来自Andrew Ng,吴神) 就比如说 J=a+bc 吧 在图计算的表示中: 1.节点表示某种运算,一般都是二元运算 ...
  • jmh1996
  • jmh1996
  • 2017年09月26日 01:16
  • 219

Tensorflow——会话

Tensorflow中的会话是来执行定义好的运算的。会话拥有并管理Tensorflow程序运行时的所有资源。当计算完成之后需要关闭会话来帮助系统回收资源,否则可能出现资源泄露的问题。 Tensorf...

TensorFlow计算图、张量、回话详细介绍

从TensorFlow这个名字中,我们可以发现,tensor(张量),flow(流),在TensorFlow中两个最重要的概念,一个TensorFlow程序主要是由计算图、张量以及模型回话三个部分组成...

Tensorflow计算、数据和运行模型

Tensorflow是一款谷歌开源的深度学习工具,与其他深度学习工具(比如caffe、Deeplearning4j等)相比,其受关注度和欢迎程度尤为突出。在谷歌内部,Tensorflow已经广泛用于语...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于Tensorflow计算图与Tensor的理解
举报原因:
原因补充:

(最多只允许输入30个字)