文章目录
一、变量管理
tf.Variable()
来创建变量方法见变量的定义tf.get_variable()
来获取变量方法见初始化常量获取变量tf.placeholder()
使用占位符创建变量,但是占位符没用初始值,它只会分配必要的内存,其值是在会话中由用户在调用run
方法传递的。
tf.placeholder(dtype, shape=None, name=None), 用来创建一个指定形状的占位符,是张量的一种特殊形式,其参数含义如下:
dtype:必填,数据类型默认为value的数据类型
shape:选填,数据形状默认时None,就是一维值也可以是多维,比如[2, 3], [None, 3]表示列是3,行不定
name:选填,占位符名,默认值不重复
import tensorflow as tf
v1 = tf.placeholder(tf.float32, shape=(2,3), name='v1')
v2 = tf.placeholder(tf.float32, shape=(None,3,4), name='v2')
print(v1.shape)
print(v2.shape)
输出结果为:
(2, 3)
(?, 3, 4)
tf.variable_scope()
用来指定变量的作用域,可以让不同作用域的变量有相同的命名,并在会话中使用tf.get_variable()
获取变量和tf.Variable()
创建的变量,该函数还可以使用属性resuse=True
表示使用已经定义过的变量,这是tf.get_variable()
不会创建新的变量而是直接获取已经创建的变量。
创建三个作用域,前两个作用域通过
tf.get_variable()
获取两个名称一致的变量,第三个作用域使用reuse=True
属性重用第二个作用域变量,并在Session中输出,其程序编写如下:
import tensorflow as tf
with tf.variable_scope('v1'):
a1 = tf.get_variable(name='a1', initializer=tf.constant(1))
with tf.variable_scope('v2'):
a2 = tf.get_variable(name='a1', initializer=tf.constant(1))
with tf.variable_scope('v2', reuse=True):
a3 = tf.get_variable('a1',dtype=tf.int32)
init_op = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init_op)
print(a1.name)
print(a2.name)
print(a3.name)
输出结果为:
v1/a1:0
v2/a1:0
v2/a1:0
tf.name_scope()
具有命名空间管理的功能,给几个变量包一层名字方便变量管理,就像操作系统文件夹命名一样,不同的顶层文件夹下可以有同名文件,在其下会话中使用tf.get_variable()
获取变量和tf.Variable()
创建的变量
tf.name_scope(name, default_name=None, values=None), 用来创建一个命名空间,其参数含义如下:
name:命名空间的名字
default_name:如果name参数为None,则使用默认的名称
value:传递给op函数的张量参数列表
import tensorflow as tf
with tf.name_scope("first"):
a1 = tf.Variable(name="weights", [1.0, 2.0])
with tf.name_scope("second"):
a2 = tf.Variable(name="weights",[3,.0, 4,0])
init_op = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init_op)
print(a1.name)
print(a2.name)
输出结果为:
first/weights:0
second/weights:0
二、将数据注入到张量中
Tensorflow的数据供给机制允许你在计算图中将数据注入到任意张量中,首先需要设置placeholder
节点,然后通过run()
函数输入feed_dict
参数中,注入方法的使用如下程序所示:
printf()中的 %i 是指定整数的格式说明符,说明要存储哪种类型的数据以及要打印哪种类型的数据,
import tensorflow as tf
a = tf.placeholder(dtype=tf.int16) #声明整型张量
b = tf.placeholder(dtype=tf.int16)
add = tf.add(a,b)
mul = tf.multiply(a,b)
with tf.Session() as sess:
print("相加:%i"%sess.run(add, feed_dict={a:3,b:4})) #将a,b的值喂入到模型中
print("相乘:%i"%sess.run(mul, feed_dict={a:3,b:4}))
输出结果为:
相加:7
相乘:12
总结
只要当变量指定确定的数值时在程序运行时需要进行全局初始化,当用类型占位符来创建张量没有初始值的方法时则不需要进行变量的全局初始化。