先来看下二者的定义:
Variable:必须给定的参数只有一个initial_value,如果名字没指定会自己生成一个Variable:0类似于此
def __init__(self, initial_value=None, trainable=True, collectiOns=None, validate_shape=True, caching_device=None, name=None, variable_def=None, dtype=None, expected_shape=None, import_scope=None):
get_variable:必须给定的参数只有name
def get_variable(name, shape=None, dtype=None, initializer=None, regularizer=None, trainable=True, collectiOns=None, caching_device=None, partitiOner=None, validate_shape=True, use_resource=None, custom_getter=None):
tf.Variable是用于生成一个新的变量,tf.get_variable是获取一个已经存在的变量,如果不存在再重建,在tensorflow中每个变量都有一个scope也就是命名空间,一个变量要的全名由scope和name唯一确定,因为tf.Variable不涉极变量复用问题,命名空间意义不是太明显,只有在用tf.get_variable时才会体会用命名空间的作用。
tf.Variable看使用详解:
import tensorflow as tf;
import numpy as np;
import matplotlib.pyplot as plt;
a1 = tf.Variable(initial_value=[[1.0,2.0,3.0],[1.0,2.0,3.0]],name="a1")
a2 = tf.Variable(initial_value=[[1.0,2.0,3.0],[1.0,2.0,3.0]],name="a2")
a3 = tf.Variable(initial_value=[[1.0,2.0,3.0],[1.0,2.0,3.0]],name="a1")
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print(sess.run(a1))
print(sess.run(a2))
print(sess.run(a3))
print(a1)
print(a2)
print(a3)
输出如下所示:
此处没有调用with tf.variable_scope(“scope_1”):,可以认为所有变量的scope为空,a3定义时name=”a1”,在这种情况下tensorflow会把a3重命名。也就是tf.Variable无论何时都能创建成功,无论是否有同名变量
tf.get_variable使用详解:
with tf.Session() as sess:
with tf.variable_scope("scope_1", reuse=False):
a1 = tf.get_variable(name='a1', shape=[2, 3], initializer=tf.random_normal_initializer(mean=0, stddev=1))
sess.run(tf.global_variables_initializer())
print(sess.run(a1))
输出如下所示:
把with tf.variable_scope(“scope_1”, reuse=False):中的resue设为True则上面的代码运行报错,这说明只有当 reuse=False时才可以创建变量, reuse=True时只能获取已有的变量或者通过tf.Variable创建新的变量,使用tf.get_variable一般都是和with tf.variable_scope(“scope_1”, reuse=True)配合使用的,共享已有变量,如果需要新变量则通过tf.Variable来创建