TensorFlow入门基础知识

TF计算模型——计算图

  1. 计算图的概念
    TensorFlow的名字包含了它最重要的两个概念——Tensor和Flow。Tensor就是张量,可以简单理解为多维数组,代表TF的数据模型。Flow翻译成中文就是“流”,直观地表达了张量之间相互转化的过程,体现了TF的计算模型。

    TensorFlow是一个通过计算图的形式来表述计算的编程系统。TensorFlow中的每一个计算都是计算图上的一个节点,而节点之间的边描述了计算之间的依赖关系。所有TensorFlow的程序都可以通过计算图的形式来表示。

  2. 计算图的使用
    在TF程序中,系统会自动维护一个默认的计算图,通过tf.get_default_graph函数可以获取当前默认的计算图。以下代码示意了如何获取默认计算图以及如何查看一个运算所属的计算图:
    import tensorflow as tf
    a = tf.constant([1.0, 2.0], name='a')
    print(a.graph is tf.get_default_graph())	# 输出True
    
    通过tf.Graph函数生成新的计算图,通过图的as_default方法替换默认图,不同计算图上的张量和运算不能共享,示例代码:
    import tensorflow as tf
    
    g1 = tf.Graph()
    with g1.as_default():
        v = tf.get_variable('v', initializer=tf.zeros_initializer(), shape=[1])
    
    g2 = tf.Graph()
    with g2.as_default():
        v = tf.get_variable('v', initializer=tf.ones_initializer(), shape=[1])
    
    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')))	# 输出[0.]
            
    with tf.Session(graph=g2) as sess:
        tf.global_variables_initializer().run()
        with tf.variable_scope('', reuse=True):
            print(sess.run(tf.get_variable('v')))	# 输出[1.]
    
    通过tf.Graph().device函数指定运行计算的设备。在未指定时TF会优先使用’/gpu:0’运行支持显卡计算的张量和运算,所以多显卡的情况下需要手动管理。示例代码:
    with tf.Graph().device('/cpu:0'):
    	result = a + b		# a,b在'/gpu:0'上,result在'/cpu:0'上
    
    在一个计算图中,可以通过集合来管理不同类别的资源。通过tf.add_to_collection函数可以将资源加入一个或多个集合中,然后通过tf.get_collection函数获取一个集合里面的所有资源。为了方便使用,TF自动管理了5个最常用的集合。
    TF自动维护的集合

TF数据模型——张量

在TensorFlow程序中,所有的数据都通过张量的形式来表示。在张量中并没有真正保存数字,它保存的是如何得到这些数字的计算过程,或者说是对运算结果的引用。

a = tf.constant([1.0, 2.0], name='a')
b = tf.constant([2.0, 3.0], name='b')
result = tf.add(a, b, name='add')
print(result)  # 输出Tensor("add:0", shape=(2,), dtype=float32)

从上段代码输出可以看出,计算结果是一个张量的结构,有三个属性:名字、维度和类型。

  • 张量的名字不仅是一个张量的唯一标识符,而且给出了这个张量是如何计算出来的。张量的命名形式是“node:src_output”,node是节点名称,src_output是表示当前张量来自节点的第几个输出。“add:0”就说明了result这个张量是计算节点add输出的第一个结果。
  • 维度属性描述了张量的维度信息,shape=(2,)说明张量result是一个一维数组,长度为2。围绕维度NP和TF都有很多运算,比如reshape函数或自身的reshape方法。
  • 每一个张量会有一个唯一的类型,TF会对张量类型作检查,不匹配时会报错。TF支持14种不同的类型,主要包括实数(tf.float32、tf.float64)、常数(tf.uint8、tf.int8、tf.int16、tf.int32、tf.int64)、布尔(tf.bool)和复数(tf.complex64、tf.complex128)。不指定类型时不带小数点的数默认为int32,带小数点的默认为float32。

TF变量

变量和张量概念相近,需要注意区分。变量(tf.Variable)的作用是保存和更新神经网络中的参数。声明方法有两种:tf.Variable和tf.get_variable

# 下面两个定义是等价的
v = tf.Variable(tf.constant(1.0, shape=[1]), name='v')
v = tf.get_variable('v', shape=[1], initializer=tf.constant_initializer(1.0))
  • tf.Variable创建变量需要给定初值,使用生成函数赋值,变量名称是可选参数。随机数生成器常数生成器
  • tf.get_variable创建变量使用变量初始化函数,变量名称是必填参数。在这里插入图片描述
    使用此函数不允许创建相同名称的变量,获取已经创建的变量要配合tf.variable_scope函数。tf.variable_scope函数生成的上下文管理器会创建一个命名空间,在命名空间中创建的变量名称都会带上这个空间名作为前缀。使用示例:
# 当设置reuse=True时,这个上下文管理器中所有tf.get_variable函数会直接获取已经创建的变量,如果不存在就会报错
# 当设置reuse=None时,这个上下文管理器中所有tf.get_variable函数会创建新变量,如果变量已经存在就会报错
# 在名字为foo的命名空间内创建名字为v的变量
with tf.variable_scope('foo'):
    v = tf.get_variable('v', [1], initializer=tf.constant_initializer(1.0))

with tf.variable_scope('foo', reuse=True):
    v1 = tf.get_variable('v', [1])
    print(v == v1) # 输出True
# tf.variable_scope函数可以嵌套,reuse的取值默认为False或和上层相同
with tf.variable_scope('root'):
    print(tf.get_variable_scope().reuse)  # 输出False
    with tf.variable_scope('foo', reuse=True):
        print(tf.get_variable_scope().reuse)  # 输出True
        with tf.variable_scope('bar'):
            print(tf.get_variable_scope().reuse)  # 输出True
v1 = tf.get_variable('v', [1])
print(v1.name)  # 输出v:0

with tf.variable_scope('foo'):
    v2 = tf.get_variable('v', [1])
    print(v2.name)  # 输出foo/v:0
    with tf.variable_scope('bar'):
        v3 = tf.get_variable('v', [1])
        print(v3.name)  # 输出foo/bar/v:0
    v4 = tf.get_variable('v1', [1])
    print(v4.name)  # 输出foo/v1:0

# 创建一个名称为空的命名空间,并设置reuse=True
with tf.variable_scope('', reuse=True):
    v5 = tf.get_variable('foo/bar/v', [1])
    print(v5 == v3)  # 输出True
    v6 = tf.get_variable('foo/v1', [1])
    print(v6 == v4)  # 输出True

TF运行模型——会话

定义好的数据和运算都需要通过会话来执行。会话拥有并管理TensorFlow程序运行时的所有资源,计算完成后需要关闭会话来帮助系统回收资源。下面代码展示会话的创建使用过程:

# Session的三种创建方式
sess = tf.Session()
with sess.as_default():
    pass
sess.close()

with tf.Session() as sess:
    pass

sess = tf.InteractiveSession()
sess.close()

无论使用哪种方法都可以通过ConfigProto Protocol Buffer来配置需要生成和会话,示例:

# allow_soft_placement增强可移植性、log_device_placement打印节点的设备分配情况
config = tf.ConfigProto(allow_soft_placement=True, log_device_placement=True)
config.gpu_options.allow_growth = True # 配置GPU内存分配方式,按需增长,很关键
config.gpu_options.per_process_gpu_memory_fraction = 0.1 # 配置可使用的显存比例
with tf.Session(config=config) as sess:
    pass

注意在jupyter中不会打印节点设备分配情况,只能在命令行中查看。显存有时候没有释放,多个文件同时处于运行中会出现很多想不到的错误。

原书《TensorFlow实战Google深度学习框架-第2版》详细介绍了TensorFlow的基础知识,是我看过相关书籍中最易懂的,也是通过这本书的第一版入门。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值