TensorFlow02.程序结构

程序结构

tensorflow程序一般分为两个阶段:

  • 阶段1:定义计算图所有的计算。
  • 阶段2:在session中执行计算。

阶段1

计算图(Computational Graph)

在理解计算图之前,先理解张量(Tensor)和流(Flow):

  • Tensor:在TensorFlow的范畴内,可以简单理解成多维数组。详细理解: https://www.cnblogs.com/abella/p/10142935.html
  • Flow:中文翻译是“流”,形象地表达了张量之间通过计算相互转化的过程。

计算图:是包含节点和边的网络,需要定义所有要使用的数据,也就是张量(tensor)对象(常量、变量和占位符),同时定义要执行的所有计算,即运算操作对象(Operation Object,简称OP)。

每个节点可以有零个或多个输入,但只有一个输出。

阶段2

计算图的执行:使用会话对象来实现计算图的执行。会话对象封装了评估张量和操作对象的环境。这里真正实现了运算操作并将信息从网络的一层传递到另外一层。不同张量对象的值仅在会话对象中被初始化、访问和保存。在此之前张量对象只被抽象定义,在会话中才被赋予实际的意义。

实例:

1.定义两个向量v_1和v_2作为输入提供给Add操作,建立计算图如下:
在这里插入图片描述
2.相应代码:

import tensorflow as tf
v_1 = tf.constant([1,2,3,4])
v_2 = tf.constant([2,1,5,3])
v_add = tf.add(v_1,v_2)

3.然后在会话中执行计算图:

with tf.Session() as sess:
    print(sess.run(v_add))

4.运行结果是显示两个向量的和:

[3 3 8 7]

完整代码:

import tensorflow as tf
v_1 = tf.constant([1,2,3,4])
v_2 = tf.constant([2,1,5,3])
v_add = tf.add(v_1,v_2)
with tf.Session() as sess:
    print(sess.run(v_add))
#会话部分可以不用with
import tensorflow as tf
v_1 = tf.constant([1,2,3,4])
v_2 = tf.constant([2,1,5,3])
v_add = tf.add(v_1,v_2)
sess = tf.Session()
print(sess.run(v_add))
sess.close()
解读分析:
  1. 该例子中计算图有三个节点组成,v_1和v_2是输入;

  2. 为了使图生效,首先需要使用tf.Session()定义一个会话对象sess.然后使用Session类中定义的run方法运行它.

    run(fetches,feed_dict = None,options = None,run_metada)
    
  3. 运行的结果在fetches中提取,提取的张量是v_add。而且一次可以提取一个或多个张量或操作对象,例如,结果抽取的是[v_1,…v_add]

    import tensorflow as tf
    v_1 = tf.constant([1,2,3,4])
    v_2 = tf.constant([2,1,5,3])
    v_add = tf.add(v_1,v_2)
    with tf.Session() as sess:
        print(sess.run([v_1,v_2,v_add]))
    
    [array([1, 2, 3, 4]), array([2, 1, 5, 3]), array([3, 3, 8, 7])]
    
  4. 在同一段代码中,可以有多个会话对象。

  5. 每个会话都需要使用close()来明确关闭,而with格式可以在运行结束后隐式关闭会话。

扩展

本人是用Jupyter Notebook进行编程的,使用tf.InteractiveSession比tf.Session更方便。因为InteractiveSession使自己成为默认会话,因此可以使用eval()直接调用运行张量对象而不用显式调用会话.

import tensorflow as tf
sess = tf.InteractiveSession()
v_1 = tf.constant([1,2,3,4])
v_2 = tf.constant([2,1,5,3])
v_add = tf.add(v_1,v_2)
print(v_add.eval())
sess.close()
[3 3 8 7]

参考:

发布了61 篇原创文章 · 获赞 7 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/MRZHUGH/article/details/102878962