TensorFlow笔记:常量和变量

常量

tf.constant()函数

tf.constant(
    value,
    dtype=None,
    shape=None,
    name='Const',
    verify_shape=False
)

用于定义常量,可以直接传入一个list来初始化 vaule ,也可以指定 valueshape 来进行填充。

tensor = tf.constant([1, 2, 3, 4, 5, 6, 7])  # [1 2 3 4 5 6 7]

tensor = tf.constant(-1.0, shape=[2, 3])  # [[-1. -1. -1.]
                                          # [-1. -1. -1.]]

tf.zeros() 和 tf.ones() 函数

生成全零或全一向量,参数有 shapedtypename

v = tf.ones([2, 3], tf.int32)  # [[1, 1, 1], [1, 1, 1]]

tf.fill() 函数

用值填充指定大小的数组,参数有 dimsvaluename

v = fill([2, 3], 9)  # [[9, 9, 9]
                     # [9, 9, 9]]

变量

tf.Variable 类

TensorFlow中的变量使用 Variable 类来保存,使用时用 initial_value 参数指定初始化函数, name 参数指定变量名。

常用的初始化函数

函数名 数据分布 主要参数
tf.random_normal 生成的数服从正态分布 shape
mean指定均值,默认为0.0
stdde指定标准差,默认为1.0
dtype指定元素类型,默认为tf.float32
seed指定随机数种子,默认为None
name指定变量名,默认为None
tf.truncated_normal 生成的数服从正态分布,但当随机值偏离均值超过2个标准差时,会重新生成这个数 同上
tf.random_uniform 生成的数服从均匀分布 shape
minval指定最小值,默认为0
maxval指定最大值,默认为None
dtype
seed
name
tf.random_gamma 生成的数服从Gamma分布 shape
alpha分布参数
bate分布参数,默认为None
dtype
seed
name

同时也支持用常量函数对变量进行初始化

v1 = tf.Variable(tf.rnadom_normal([2, 3], stddev=1))

v2 = tf.Variable(tf.zeros([2, 3], tf.int))

变量的初始化

变量与常量不同的是,变量只是指定了生成的方法,但是在运行之前并没有真正的进行初始化,所以对于所有变量都应该运行 val.initializer 初始化操作,出于方便,TensorFlow提供了统一的初始化操作

init_op = tf.global_variables_initializer()
sess.run(init_op)

tf.get_variable() 函数

tf.get_variable() 函数也用于生成变量,相比于 tf.Variable 类,该函数多了对变量名进行检查的过程,该函数不允许在同一个变量上下文中出现同名变量。在使用 tf.Variable 类创建同名变量时,生成函数会自动修正变量的名称,而 tf.get_variable() 函数则会根据上下文选择生成新变量或重用已有变量

with tf.variable_scope('my_scope', reuse=tf.AUTO_REUSE) as my_scope:
    x1 = tf.Variable(tf.ones([1]), name='x1')
    x2 = tf.Variable(tf.zeros([1]), name='x1')
    y1 = tf.get_variable('y1', initializer=1.0)
    y2 = tf.get_variable('y1', initializer=0.0)
    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())
        print(x1.name, x1.eval())  # my_scope/x1:0 [1.]
        print(x2.name, x2.eval())  # my_scope/x1_1:0 [0.]
        print(y1.name, y1.eval())  # my_scope/y1:0 1.0
        print(y2.name, y2.eval())  # my_scope/y1:0 1.0

变量上下文

通过 tf.variable_scope() 可以生成变量上下文,参数 reuse 可以指定在对应上下文中 tf.get_variable() 函数的行为。reuse=False 使得函数生成新变量,在生成重名变量时报错。 reuse=True 使得函数获取已经创建的变量,获取未创建的变量时报错。如果要自动判断,可以指定 reuse=tf.AUTO_REUSE

初始化类

tf.Variable 的另一个不同之处是 tf.get_variable() 函数需要指定初始化类 initializer 参数才能生成不同分布的数据,以下是常用的初始化类,常用参数与初始化函数差不多

初始化类 数据分布
tf.constant_initializer 使用常量初始化
tf.zeros_initializer 使用全0初始化
tf.ones_initializer 使用全1初始化
tf.random_normal_initializer 初始化变量满足正态分布。如果某个变量超过均值两个标准差,则重新初始化这个变量
tf.random_uniform_initializer 初始化变量满足平均分布

tf.placeholder()函数

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

这个函数的是用来声明数据的存储地点的。因为TensorFlow是基于计算图的,他要为所有的数据都声明一个存储位置,定义这个数据和在数据上的操作。想象这样一种情况,当输入的数据量很大的时候(这也是很通常的情况),每定义一个常量,就会在计算图中增加一个节点,最后导致整个计算图非常的大。然而在进行随机梯度下降的时候,我们每次并不需要输入所有的数据,因此Tensorflow提供了这样一种方法,只定义数据的位置和操作,而具体的值则在运行时再指定。

input_data = read_data_from_file(file)

x = tf.placeholder(tf.float32, shape=(None, 2), name='x')
w = tf.Variable(tf.random_normal([2, 5], stddev=1))
y = tf.matmul(x, w)

# ...其他操作

with tf.Session() as sess:
    feed_dict = {x: input_data}  # 也可以传入部分数据input_data[beg:end]
    print(sess.run(y, feed_dict=feed_dict))

tf.placeholder() 还有一个特点就是他的 shape 可以根据给定的数据计算得到,所以可以只给出确定的维度,甚至可以不给出。在会话中运行时,通过 feed_dict 参数传入输入值。

你可能感兴趣的:(python,TensorFlow)