继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

TensorFlow入门:变量管理

30秒到达战场
关注TA
已关注
手记 415
粉丝 95
获赞 569

一、TensorFlow变量管理


1. TensorFLow还提供了tf.get_variable函数来创建或者获取变量,tf.variable用于创建变量时,其功能和tf.Variable基本是等价的。tf.get_variable中的初始化方法(initializer)的参数和tf.Variable的初始化过程也类似,initializer函数和tf.Variable的初始化方法是一一对应的,详见下表。

tf.get_variable和tf.Variable最大的区别就在于指定变量名称的参数。对于tf.Variable函数,变量名称是一个可选的参数,通过name=”v”的形式给出,对于tf.get_variable函数,变量名称是一个必填的参数,tf.get_variable会根据这个名称去创建或者获取变量。

2. 通过tf.variable_scope函数可以控制tf.get_variable函数的语义。当tf.variable_scope函数的参数reuse=True生成上下文管理器时,该上下文管理器内的所有的tf.get_variable函数会直接获取已经创建的变量,如果变量不存在则报错;当tf.variable_scope函数的参数reuse=False或者None时创建的上下文管理器中,tf.get_variable函数则直接创建新的变量,若同名的变量已经存在则报错。

3. 另tf.variable_scope函数是可以嵌套使用的。嵌套的时候,若某层上下文管理器未声明reuse参数,则该层上下文管理器的reuse参数与其外层保持一致。

4.tf.variable_scope函数提供了一个管理变量命名空间的方式。在tf.variable_scope中创建的变量,名称.name中名称前面会加入命名空间的名称,并通过“/”来分隔命名空间的名称和变量的名称。tf.get_variable("foou/baru/u", [1]),可以通过带命名空间名称的变量名来获取其命名空间下的变量。

二、TensorFlow编程演示

  1. import tensorflow as tf  

  2.   

  3. # 在名字为foo的命名空间内创建名字为v的变量  

  4. with tf.variable_scope("foo"):  

  5.     v = tf.get_variable("v", [1], initializer=tf.constant_initializer(1.0))  

  6.   

  7. ''''' 

  8. # 因为命名空间foo内已经存在变量v,再次创建则报错 

  9. with tf.variable_scope("foo"): 

  10.     v = tf.get_variable("v", [1]) 

  11. # ValueError: Variable foo/v already exists, disallowed. 

  12. # Did you mean to set reuse=True in VarScope? 

  13. '''  

  14. # 将参数reuse参数设置为True,则tf.get_variable可直接获取已声明的变量  

  15. with tf.variable_scope("foo", reuse=True):  

  16.     v1 = tf.get_variable("v", [1])  

  17.     print(v == v1) # True  

  18.   

  19. ''''' 

  20. # 当reuse=True时,tf.get_variable只能获取指定命名空间内的已创建的变量 

  21. with tf.variable_scope("bar", reuse=True): 

  22.     v2 = tf.get_variable("v", [1]) 

  23. # ValueError: Variable bar/v does not exist, or was not created with 

  24. # tf.get_variable(). Did you mean to set reuse=None in VarScope? 

  25. '''  

  26.   

  27. with tf.variable_scope("root"):  

  28.     # 通过tf.get_variable_scope().reuse函数获取当前上下文管理器内的reuse参数取值  

  29.     print(tf.get_variable_scope().reuse) # False  

  30.   

  31.     with tf.variable_scope("foo1", reuse=True):  

  32.         print(tf.get_variable_scope().reuse) # True  

  33.   

  34.         with tf.variable_scope("bar1"):  

  35.             # 嵌套在上下文管理器foo1内的bar1内未指定reuse参数,则保持与外层一致  

  36.             print(tf.get_variable_scope().reuse) # True  

  37.   

  38.     print(tf.get_variable_scope().reuse) # False  

  39.   

  40. # tf.variable_scope函数提供了一个管理变量命名空间的方式  

  41. u1 = tf.get_variable("u", [1])  

  42. print(u1.name) # u:0  

  43. with tf.variable_scope("foou"):  

  44.     u2 = tf.get_variable("u", [1])  

  45.     print(u2.name) # foou/u:0  

  46.   

  47. with tf.variable_scope("foou"):  

  48.     with tf.variable_scope("baru"):  

  49.         u3 = tf.get_variable("u", [1])  

  50.         print(u3.name) # foou/baru/u:0  

  51.   

  52.     u4 = tf.get_variable("u1", [1])  

  53.     print(u4.name) # foou/u1:0  

  54.   

  55. # 可直接通过带命名空间名称的变量名来获取其命名空间下的变量  

  56. with tf.variable_scope("", reuse=True):  

  57.     u5 = tf.get_variable("foou/baru/u", [1])  

  58.     print(u5.name)  # foou/baru/u:0  

  59.     print(u5 == u3) # True  

  60.     u6 = tf.get_variable("foou/u1", [1])  

  61.     print(u6.name)  # foou/u1:0  

  62.     print(u6 == u4) # True  

原文出处

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP