随机数生成
tf.random_uniform_initializer
tf.random_uniform_initializer(-0.1, 0.1, seed=2) 生成具有[-0.1, 0.1]均匀分布的张量的初始化器。
tf.truncated_normal与tf.random_normal
tf.truncated_normal
从截断的正态分布中输出随机值。
生成的值服从具有指定平均值和标准偏差的正态分布,如果生成的值大于平均值2个标准偏差的值则丢弃重新选择。
tf.truncated_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)
shape: 一维的张量,也是输出的张量。
mean: 正态分布的均值。
stddev: 正态分布的标准差。
dtype: 输出的类型。
seed: 一个整数,当设置之后,每次生成的随机数都一样。
name: 操作的名字。
tf.random_normal
从正态分布中输出随机值。
tf.random_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)
参数:
shape: 一维的张量,也是输出的张量。
mean: 正态分布的均值。
stddev: 正态分布的标准差。
dtype: 输出的类型。
seed: 一个整数,当设置之后,每次生成的随机数都一样。
name: 操作的名字。
随机数生成种子
Tensorflow中的随机数生成种子是在数据流图资源上运作的。每一个数据流图中,我们可以执行针对随机数生成种子应用不同的操作(operation)。
op-level: 随机数生成种子作为random系列函数的参数之一,可在相应的参数列表进行设置,这就是op-level的操作。
graph-level: 与之对应的是graph-level的操作tf.set_random_seed(),它管理着同一数据流图下的资源。
import tensorflow as tf
# Repeatedly running this block with the same graph will generate the same
# sequences of 'a' and 'b'.
g1 = tf.Graph()
g2 = tf.Graph()
print("Graph 1")
with g1.as_default():
tf.set_random_seed(-1)
a = tf.random_uniform([1])
b = tf.random_normal([1])
print("Session 1")
with tf.Session() as sess1:
print(sess1.run(a)) # generates 'A1'
print(sess1.run(a)) # generates 'A2'
print(sess1.run(b)) # generates 'B1'
print(sess1.run(b)) # generates 'B2'
print("Session 2")
with tf.Session() as sess2:
print(sess2.run(a)) # generates 'A1'
print(sess2.run(a)) # generates 'A2'
print(sess2.run(b)) # generates 'B1'
print(sess2.run(b)) # generates 'B2
print("--------------")
print("Graph 2")
with g2.as_default():
a = tf.random_uniform([1])
b = tf.random_normal([1],seed=-1)
print("Session 3")
with tf.Session() as sess3:
print(sess3.run(a)) # generates 'A1'
print(sess3.run(a)) # generates 'A2'
print(sess3.run(b)) # generates 'B1'
print(sess3.run(b)) # generates 'B2'
print("Session 4")
with tf.Session() as sess4:
print(sess4.run(a)) # generates 'A3'
print(sess4.run(a)) # generates 'A4'
print(sess4.run(b)) # generates 'B1'
print(sess4.run(b)) # generates 'B2'
>>>
Graph 1
Session 1
[0.45231807]
[0.82921326]
[-0.90662855]
[0.52898115]
Session 2
[0.45231807]
[0.82921326]
[-0.90662855]
[0.52898115]
--------------
Graph 2
Session 3
[0.18341184]
[0.42214954]
[-0.96254766]
[-1.088825]
Session 4
[0.40388882]
[0.7478839]
[-0.96254766]
[-1.088825]
在Graph1中,我们通过tf.set_random_seed()函数对该图资源下的全局随机数生成种子进行设置,使得不同Session中的random系列函数表现出相对协同的特征,这就是Graph-Level的表现;
在Graph2中,我们仅对张量b进行了seed设置,可以发现,这是Op-Level的表现,仅在执行张量b的情况下,才会有和Graph1类似的协同效果。另外,值得注意的是,seed的传参类型为integer,所以只要是整数(如果过大,源码中会进行截断),就能完成它的设置(可以是1234、87654321等),效果和上述的-1是一样的。
常量生成
Tensors常量值函数
tf.zeros(shape, dtype=tf.float32, name=None)
tf.zeros_like(tensor, dtype=None, name=None)
tf.ones(shape, dtype=tf.float32, name=None)
tf.ones_like(tensor, dtype=None, name=None)
tf.fill(dims, value, name=None)
tf.constant(value, dtype=None, shape=None, name='Const')
想生成一个和tensor维度相同的全为0或者1的对象,但又不知道这个tensor的维度时,可以使用:
tf.zeros_like(tensor, dtype=None, name=None)
tf.ones_like(tensor, dtype=None, name=None)
tf.fill(dims, value, name=None)
创建一个维度为dims,值为value的tensor对象.该操作会创建一个维度为dims的tensor对象,并将其值设置为value,该tensor对象中的值类型和value一致
当value为0时,该方法等同于tf.zeros()
当value为1时,该方法等同于tf.ones()