随机数生成、常量生成

随机数生成

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()

原文地址:https://www.cnblogs.com/yongfuxue/p/10095881.html