TensorFlow入门知识

----------欢迎加入学习交流QQ群:657341423

安装TensorFlow

Windows安装TensorFlow可以下载TensorFlow安装包,下载链接。安装包下载后,在CMD窗口下使用pip安装即可

TensorFlow安装成功后,我们介绍TensorFlow的相关概念,它分为三部分:计算模型、数据模型和运行模型。

计算模型-计算图

Tensorflow是一个通过计算图的形式来表述计算的编程系统,计算图也叫数据流图,可以把计算图看做是一种有向图,Tensorflow中的每一个计算都是计算图上的一个节点,而节点之间的边描述了计算之间的依赖关系。
在这里插入图片描述

在TensorFlow程序中,系统会维护一个默认的计算图,通过tf.get_default_graph()函数可以获取当前默认的计算图:

import tensorflow as tf
a = tf.constant([1.0, 2.0], name='a')
b = tf.constant([2.0, 3.0], name='b')
print(a)
print(a.graph == tf.get_default_graph())
# 输出
Tensor("a:0", shape=(2,), dtype=float32)
True

tf.constant代表定义一个计算节点,如果该节点没有指定某个计算图,则默认放在TensorFlow的默认计算图,即tf.get_default_graph()函数所得的计算图。
除了默认计算图之外,TensorFlow支持创建新的计算图,不同计算图的资源不会共享,自定义计算图如下:

import tensorflow as tf
g1 = tf.Graph()
with g1.as_default():
    # 在计算图g1里定义tf的变量
    v = tf.get_variable(
        'v',shape=[1],initializer=tf.zeros_initializer
    )
# 读取计算图g1的变量v
with tf.Session(graph=g1) as sess:
    tf.global_variables_initializer().run()
    with tf.variable_scope('',reuse=True):
        print(sess.run(tf.get_variable('v')))

TensorFlow的变量和计算是两个不同的概念,在此需要区分清楚。计算图Graph通过tf.Graph.device()函数来制定运行计算图的设备, 下图定义的程序可以将加法计算跑在GPU上:

g = tf.Graph()
# 指定计算运行的设备
with g.device('/gpu:0'):
    result = a + b

此外,在一个计算图中,可以集合来管理不同类别的资源,通过tf.add_to_collection()函数将资源加入一个collection中,然后通过tf.get_collection获取一个集合里面的所有资源。资源可以指变量、运算节点(张量)等TensorFlow所需的资源。常用的集合列表如下:
在这里插入图片描述

数据模型-张量

上面讲述了 tf.constant代表定义一个计算节点,定义方式如下:

import tensorflow as tf
a = tf.constant([1.0, 2.0], name='a')
print(a)
# 输出
Tensor("a:0", shape=(2,), dtype=float32)

准确地来说,计算节点就是一个张量,当输出a的时候,其结构是张量的结构,输出内容包含三个属性:名字、维度和类型。

  • 名字是张量的标识符,如“a:0”,a为计算图里面节点的名称,0代表该节点输出的一个结果,一个节点可能会有多个输出结果。
  • 维度描述张量的数据属性,如(2,),代表一个一维数组,数组长度为2。如a = tf.constant([[1.0, 2.0],[1.0, 2.0],[1.0, 2.0]], name='a'),输出Tensor("a:0", shape=(3, 2), dtype=float32),这是二维数组,长度为3。
  • 类型是数据类型,如字符串、布尔型、整型等。如果在运算的时候,如果张量的数据类型不一致,会提示报错。如:
 import tensorflow as tf
a = tf.constant([[1.0],[1.0],[1.0]], name='a')
b = tf.constant([[1],[1],[1]], name='b')
print(a+b)
# 输出
TypeError: Input 'y' of 'Add' Op has type int32 that does not match type float32 of argument 'x'.

运行模型-会话

会话拥有并管理TensorFlow程序运行时的所有资源,张量只不过是定义计算方式,如果要让计算方式运行,需要TensorFlow的会话来执行。使用如下:

import tensorflow as tf
a = tf.constant([[1.0,2],[1.0,2],[1.0,2]], name='a')
b = tf.constant([[1.0,2],[1.0,2],[1.0,2]], name='b')
sess = tf.Session()
result = sess.run(a+b)
print(result)
sess.close()
# 输出
[[2. 4.]
 [2. 4.]
 [2. 4.]]

由于[1.0,2]的1.0和2是不同的数据类型,前者是浮点型,后者是整型,因此TensorFlow将计算结果皆以浮点型表示。除了这种方式,还可以使用python的with模块实现,这样不用调用sess.close()关闭会话。
我们知道张量和变量是存在于计算图里,不同的计算图需要创建相应的会话执行,在创建会话的时候,若无指定的计算图,则在默认的计算图里创建会话。如下所示:

import tensorflow as tf
# 定义g1计算图
g1 = tf.Graph()
with g1.as_default():
    a = tf.constant([[1.0,2],[1.0,2],[1.0,2]], name='a')
    b = tf.constant([[1.0,2],[1.0,2],[1.0,2]], name='b')
# 在g1计算图里创建会话
with tf.Session(graph=g1) as sess:
    # 下面的两者均可计算a+b
    print((a+b).eval())
    print(sess.run(a+b))
 # 输出:
 # 第一次print
 [[2. 4.]
 [2. 4.]
 [2. 4.]]
 # 第二次print
[[2. 4.]
 [2. 4.]
 [2. 4.]]

在创建会话的时候,我们可以通过ConfigProto来设置会话,如下所示:

import tensorflow as tf
config = tf.ConfigProto(allow_soft_placement=True,
                        log_device_placement=True, )
c = tf.constant([[1.0, 2], [1.0, 2], [1.0, 2]], name='c')
d = tf.constant([[1.0, 2], [1.0, 2], [1.0, 2]], name='d')
with tf.Session(config=config) as sess:
    # 下面的两者均可计算c+d
    print((c + d).eval())
    print(sess.run(c + d))

allow_soft_placement是将GPU的运算放到CPU上运算。 log_device_placement是设置日志功能。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章