【深度学习】TensorFlow变量

117 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第17天,点击查看活动详情

注意:本文使用tensorflow1.x版本进行演示

使用本地Jupyter Notebook搭载TensorFlow相关库进行操作

1. 变量

TensorFlow变量是表示程序处理的共享持久状态的最佳方法,变量通过tf.VariableOP类进行操作。非常适合保存模型参数,这也决定了变量的特点如下:

  • 存储持久化
  • 可修改值
  • 可指定被训练

1.1 创建变量

tf.Variable(initial_value=None, trainable=True, collections=None, name=None)

  • initial_value:初始化的值
  • trainable:是否可以被训练
  • collections:新变量将添加到列出的图的集合中colletions,如果trainable是True变量也被添加到图形集合GraphKeys.GLOBAL_VARIABLES
  • 注意:变量需要显式初始化,才能运行值。
    • 需要在开启会话前,单独使用tf.global_variables_initializer()初始化操作对变量进行初始化。

创建变量代码演示如下所示:

  • 创建一个函数,用来演示创建变量
  • 创建三个变量
  • 初始化变量操作
  • 开启会话
  • 使用sess.run()来运行operation
def variable_demo():
    """
    创建变量的演示
    """
    
    # 创建变量
    v1 = tf.Variable(initial_value=20)
    v2 = tf.Variable(initial_value=10)
    v_add = tf.add(v1, v2)
    print("v1:\n", v1)
    print("v2:\n", v2)
    print("v_add:\n", v_add)
    
    # 初始化变量
    init = tf.global_variables_initializer()
    
    # 开启会话
    with tf.Session() as sess:
        # 运行初始化
        sess.run(init)
        value_1, value_2, value_add = sess.run([v1, v2, v_add])
        print("value_1:\n", value_1)
        print("value_2:\n", value_2)
        print("value_add:\n", value_add)
    return None

运行结果如下图所示:

  • 如果没有初始化变量操作,只是开启会话,会出现报错
  • 因此,在初始化变量操作以后,会显示出变量的值
  • 创建变量时的initial_value并不是初始化,注意不要被混淆 image.png

1.2 修改变量命名空间

使用tf.variable_scope()可以修改命名空间,就会在指令名称之前出现你想要的命名。

  • 会在OP的名字前面增加命名空间的指定名字
  • ()中添加你想要的命名
  • 在创建变量时,开启变量命名空间
  • 对于不同的变量,可以分别开启不同的命名空间
def variable_demo():
    """
    创建变量的演示
    """
    
    # 创建变量
    with tf.variable_scope("scope111"):
        v1 = tf.Variable(initial_value=20)
        v2 = tf.Variable(initial_value=10)
    with tf.variable_scope("scope222"):
        v_add = tf.add(v1, v2)
    print("v1:\n", v1)
    print("v2:\n", v2)
    print("v_add:\n", v_add)
    
    # 初始化变量
    init = tf.global_variables_initializer()
    
    # 开启会话
    with tf.Session() as sess:
        # 运行初始化
        sess.run(init)
        value_1, value_2, value_add = sess.run([v1, v2, v_add])
        print("value_1:\n", value_1)
        print("value_2:\n", value_2)
        print("value_add:\n", value_add)
    return None

variable_demo()

运行结果如下图所示:

  • 这样做方便代码模块化,使每个部分之间比较清晰。
  • 在写成事件文件,经过可视化,也会使得图的结构更清晰。 image.png