在学习TensorFlow的Variable时遇到了几个问题,在此记录下
第一个例子
#最简单的一个例子-----------------------------------------
a = 3
# 第一步,Create a variable.
w = tf.Variable([[0.5,1.0]])
x = tf.Variable([[2.0],[1.0]])
#第二步,做矩阵相乘
y = tf.matmul(w, x)
with tf.Session() as sess:
tf.global_variables_initializer().run() #第一种方法,直接全局初始化
sess.run(x.initializer) #第二种方法,单独初始化x(当然,只初始化x无法打印y,必须初始化x和w,而y不用初始化)
print (y.eval()) #第一种输出y的方法
print(sess.run(y)) #第二种输出y的方法
第二个例子,用tf函数创造variable
import tensorflow as tf
x=tf.Variable(tf.random_normal((2,3),stddev=1))
with tf.Session() as sess:
tf.global_variables_initializer().run()
print(sess.run(x))
输出结果:
上面例子说明varibale可以传tf的函数来构造,此函数式创建(2,3)的variable类型的二维数组,每个数用正态分布构造,标准差是1
第三个例子,用constant创造variable
import tensorflow as tf
x=tf.Variable(tf.constant(1.0,shape=[2,3]),name='x') #name可以省略
with tf.Session() as sess:
tf.global_variables_initializer().run()
print(sess.run(x))
输出为:
![](https://i-blog.csdnimg.cn/blog_migrate/c958ef8fdebbe6d45ad178a09af74eac.png)
第四个例子
variable与get_variable的区别(简述)
import tensorflow as tf
x=tf.Variable(tf.constant(1.0,shape=[2,3]),'x')
y=tf.get_variable("y",shape=[2,3],initializer=tf.constant_initializer(1.0))
#y1=tf.get_variable(tf.constant(1.0,shape=[2,3]),'y1') #会报错
with tf.Session() as sess:
tf.global_variables_initializer().run()
print(sess.run(x))
print(sess.run(y))
#print(sess.run(y1))
get_variable与Variable传入参数有所不同,主要区别是前者name为必传参数,后者可以没有name,另外就是前者与variable_scope配合使用,这里不做详细描述
注意:get_variable经常的用法是传入name和shape,initializer可以不传,initializer并不代表初始化了此变量,要用此变量还是需要初始化
第五个例子:variable_scope简单实例
import tensorflow as tf
with tf.variable_scope('scope1',reuse=False):
y=tf.get_variable("y",shape=[2,3],initializer=tf.constant_initializer(1.0))
with tf.Session() as sess:
tf.global_variables_initializer().run()
print(sess.run(y))
with tf.variable_scope('scope1',reuse=True):
y1= tf.get_variable("y",shape=[2,3],initializer=tf.constant_initializer(2.0))
with tf.Session() as sess:
tf.global_variables_initializer().run()
print(sess.run(y1))
可以看出,在reuse=False时是创建变量,一旦变量被创建,则可以在同一个名字的scope中使用(此时reuse=True),即使
重新设置了不同的initializer,输出仍为原始: