Tensorflow——tf.Variable()、tf.get

作者: SpareNoEfforts | 来源:发表于2018-10-29 20:10 被阅读122次

    tf.Variable()

      tf.Variable(initializer,name),参数initializer是初始化参数,name是可自定义的变量名称,用法如下:

    import tensorflow as tf
    v1=tf.Variable(tf.random_normal(shape=[4,3],mean=0,stddev=1),name='v1')
    v2=tf.Variable(tf.constant(2),name='v2')
    v3=tf.Variable(tf.ones([4,3]),name='v3')
    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())
        print(sess.run(v1))
        print(sess.run(v2))
        print(sess.run(v3))
    

    结果如下:
    [[-1.2115501 1.0484737 0.55210656]
    [-1.5301195 0.9060654 -2.6766613 ]
    [ 0.27101386 -0.32336152 0.44544214]
    [-0.0120788 -0.3409422 -0.48505628]]

    2

    [[1. 1. 1.]
    [1. 1. 1.]
    [1. 1. 1.]
    [1. 1. 1.]]

    tf.get_variable()

      tf.get_variable(name, shape, initializer): name就是变量的名称,shape是变量的维度,initializer是变量初始化的方式,初始化的方式有以下几种:

    tf.constant_initializer:常量初始化函数
    tf.random_normal_initializer:正态分布
    tf.truncated_normal_initializer:截取的正态分布
    tf.random_uniform_initializer:均匀分布
    tf.zeros_initializer:全部是0
    tf.ones_initializer:全是1
    tf.uniform_unit_scaling_initializer:满足均匀分布,但不影响输出数量级的随机值

    
    import tensorflow as tf;  
    import numpy as np;  
    import matplotlib.pyplot as plt;  
      
    a1 = tf.get_variable(name='a1', shape=[2,3], initializer=tf.random_normal_initializer(mean=0, stddev=1))
    a2 = tf.get_variable(name='a2', shape=[1], initializer=tf.constant_initializer(1))
    a3 = tf.get_variable(name='a3', shape=[2,3], initializer=tf.ones_initializer())
     
    with tf.Session() as sess:
        sess.run(tf.initialize_all_variables())
        print sess.run(a1)
        print sess.run(a2)
    
    

    输出:

    [[ 0.42299312 -0.25459203 -0.88605702]
    [ 0.22410156 1.34326422 -0.39722782]]

    [ 1.]

    [[ 1. 1. 1.]
    [ 1. 1. 1.]]

    tf.Variable()、tf.get_variable() 两者区别

       tf.get_variable的参数列表为tf.get_variable(name, shape=None, initializer=None, dtype=tf.float32, trainable=True, collections=None),如果已存在参数定义相同的变量,就返回已存在的变量,否则创建由参数定义的新变量
      所以tf.get_variable创建变量时,会进行变量检查,当设置为共享变量时(通过scope.reuse_variables()或tf.get_variable_scope().reuse_variables()),检查到第二个拥有相同名字的变量,就返回已创建的相同的变量;如果没有设置共享变量,则会报[ValueError: Variable varx alreadly exists, disallowed.]的错误。
       而tf.Variable()创建变量时,name属性值允许重复,检查到相同名字的变量时,由自动别名机制创建不同的变量。

    例如;

    with tf.name_scope('name_scope_1'):
    var1 = tf.get_variable(name='var1', shape=[1], initializer=None, dtype=tf.float32)
    var2 = tf.Variable(name='var2', initial_value=[1], dtype=tf.float32)
    var21 = tf.Variable(name='var2', initial_value=[2], dtype=tf.float32)
    
    输出name时,如下:
    var1:0
    name_scope_1/var2:0
    name_scope_1/var2_1:0
    
    

    with tf.name_scope('name_scope_2') as scope:
    scope.reuse_variables() #tf.get_variable_scope().reuse_variables()
    var1 = tf.get_variable(name='var1', shape=[1], initializer=None, dtype=tf.float32)
    var11 = tf.get_variable(name='var1')
    var2 = tf.Variable(name='var2', initial_value=[1], dtype=tf.float32)
    var21 = tf.Variable(name='var2', initial_value=[2], dtype=tf.float32)
    with tf.Session() as sess:
    print(var1.name)
    print(var11.name)
    print(var2.name)
    print(var21.name)
    
    输出name时,如下:
    var1:0
    var1:0
    name_scope_2/var2:0
    name_scope_2/var2_1:0
    
    

    tf.placeholder()

    tf.placeholder(dtype, shape=None, name=None)

    placeholder,占位符,在tensorflow中类似于函数参数,运行时必须传入值。

    • dtype:数据类型。常用的是tf.float32,tf.float64等数值类型。
    • shape:数据形状。默认是None,就是一维值,也可以是多维,比如[2,3], [None, 3]表示列是3,行不定。
    • name:名称。
    import tensorflow as tf
    import numpy as np
     
    input1 = tf.placeholder(tf.float32)
    input2 = tf.placeholder(tf.float32)
     
    output = tf.multiply(input1, input2)
     
    with tf.Session() as sess:
        print sess.run(output, feed_dict = {input1:[3.], input2: [4.]})
    

    相关文章

      网友评论

        本文标题:Tensorflow——tf.Variable()、tf.get

        本文链接:https://www.haomeiwen.com/subject/tcsitqtx.html