gpt4 book ai didi

variables - `tf.random_normal` 和 `tf.random_normal_initializer` 有什么区别?

转载 作者:行者123 更新时间:2023-12-04 22:55:42 25 4
gpt4 key购买 nike

使用这两个函数似乎得到了相同的结果。

t4 = tf.get_variable('t4', initializer=tf.random_normal((2,), seed=0))
t5 = tf.get_variable('t5', shape=(2,), initializer=tf.random_normal_initializer(seed=0))

我在 random_normal_initializer()里面找到了也可以使用 random_normal() .

我隐约意识到他们之间的区别。 random_normal将返回一个常数张量,但 random_normal_initializer初始化后将返回值。

我想知道更多关于如何在正确的时间使用这两个功能。

是否使用 random_normal初始化一个变量实际上会初始化两次(在初始化变量之后)?换句话说,如果它们之间存在性能问题。

最佳答案

Maxim 对这个问题的回答非常好,但我想回答 OP 可能会问的一个稍微简单一点的问题(举几个例子):

最基本的回答 :tf.random_normalTensor ;但是 tf.random_normal_initializerRandomNormal , 不是 Tensor .我认为简单的代码最能说明这两者之间的区别:

# Simple examples to clarify tf.random_normal from tf.random_normal_initializer
tf.reset_default_graph()
# OP's code
t4 = tf.get_variable('t4', initializer=tf.random_normal((2,), seed=0))
t5 = tf.get_variable('t5', shape=(2,), initializer=tf.random_normal_initializer(seed=0))
# clarifying Tensor vs Initializer outside the context of get_variable.
t6 = tf.random_normal((2,),seed=0)
t7 = tf.random_normal_initializer(seed=0)
# types
print(type(t6)) # <class 'tensorflow.python.framework.ops.Tensor'>
print(type(t7)) # <class 'tensorflow.python.ops.init_ops.RandomNormal'>
# run the graph...
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
# OP's code
print(sess.run(t4)) #[-0.39915761 2.10443926]
print(sess.run(t5)) #[-0.39915761 2.10443926]
# tf.random_normal is a Tensor
print(sess.run(t6)) #[-0.39915761 2.10443926]
# tf.random_normal_initializer returns a tf.RandomNormal, not a Tensor or Op, so can't be sess.run()!
try:
print(sess.run(t7)) # Exception!
except:
print("Exception!")
# But notice that you don't need to initialize an initializer, just a variable.
t8 = tf.random_normal_initializer(seed=0)
t9 = tf.get_variable('t9',shape=(2,), initializer=t8)
sess.run(t9.initializer) # still need to initialize the variable
print(sess.run(t9)) #[-0.39915761 2.10443926]

在您的设置中 :现在,就您调用的代码而言,没有真正的区别; initializer关键字被重载以接受两者,并将按照 Maxim 指示的方式运行。来自 the tf/ops/variable_scope docs :

if initializer is None:
init, initializing_from_value = self._get_default_initializer(
name=name, shape=shape, dtype=dtype)
if initializing_from_value:
init_shape = None
else:
init_shape = var_shape
elif callable(initializer):
init = initializer
init_shape = var_shape
elif isinstance(initializer, ops.Tensor):
init = array_ops.slice(initializer, var_offset, var_shape)
# Use the dtype of the given tensor.
dtype = init.dtype.base_dtype
init_shape = None
else:
init = ops.convert_to_tensor(initializer, dtype=dtype)
init = array_ops.slice(init, var_offset, var_shape)
init_shape = None

关于variables - `tf.random_normal` 和 `tf.random_normal_initializer` 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48181961/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com