我应该自己初始化变量还是仅通过global_variable_initialize()初始化?

时间:2018-05-04 15:48:32

标签: tensorflow initialization global-variables

我正在做一个时间序列预测工作,而在张量流中使用RNNCell并不像我自己编写初始化变量,而是经常使用函数global_variable_initialize()来完成这项工作。

调用函数并为我初始化所有变量感觉很奇怪。我听说global_variable_initialize()检索包含以下内容的变量列表:[所有权重,所有偏差,所有隐藏状态],但它就像一个黑盒子,因为我不知道变量范围,我不使用我自己写网络时的偏见。

对于tensorflow用户,您更喜欢自己初始化变量(例如使用tf.Variable)吗?只需调用global_variable_initialize()?

是否有任何问题或缺点

希望了解大家的意见,谢谢!

2 个答案:

答案 0 :(得分:1)

全局变量初始值设定项不是黑盒子,它使用GraphKeys集合,如下所述:

Usage of tf.GraphKeys

tensorflow中的大多数操作都将变量添加到适当的集合中作为约定。优化器使用这些相同的集合来确定哪些变量是可训练的,而不是默认情况下。看看合适的系列。

根据我的经验,除了由tf.metrics.*包创建的变量(默认为局部变量)之外,大多数都是全局变量(因此您可以使用局部变量初始化程序重置度量标准)。

答案 1 :(得分:0)

我也不喜欢使用global_variable_initialize。 实际上,使用TF-SLIM可以有效且简洁地定义变量。
我引自TensorFlow-Slim documentation

  

在原生张量流中创建变量需要预定义值或初始化机制(例如,从高斯随机采样)。此外,如果需要在特定设备(例如GPU)上创建变量,则必须明确规范。为了减轻变量创建所需的代码,TF-Slim在variables.py中提供了一组瘦包装函数,允许调用者轻松定义变量。

     

例如,要创建权重变量,使用截断的正态分布对其进行初始化,使用l2_loss对其进行规范化并将其放在CPU上,只需要声明以下内容:

weights = slim.variable('weights', shape=[10, 10, 3 , 3],  
                        initializer=tf.truncated_normal_initializer(stddev=0.1),   
                        regularizer=slim.l2_regularizer(0.05), device='/CPU:0')