我正在做一个时间序列预测工作,而在张量流中使用RNNCell并不像我自己编写初始化变量,而是经常使用函数global_variable_initialize()来完成这项工作。
调用函数并为我初始化所有变量感觉很奇怪。我听说global_variable_initialize()检索包含以下内容的变量列表:[所有权重,所有偏差,所有隐藏状态],但它就像一个黑盒子,因为我不知道变量范围,我不使用我自己写网络时的偏见。
对于tensorflow用户,您更喜欢自己初始化变量(例如使用tf.Variable)吗?只需调用global_variable_initialize()?
是否有任何问题或缺点希望了解大家的意见,谢谢!
答案 0 :(得分:1)
全局变量初始值设定项不是黑盒子,它使用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')