关于TensorFlow的Variable

在学习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))
输出为:


第四个例子

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,输出仍为原始:


猜你喜欢

转载自blog.csdn.net/csdn_black/article/details/79834579