tf.get_variable不接受形状

时间:2017-04-18 20:59:07

标签: tensorflow

tf.get_variable似乎不接受Tensor形状,仅int。这与tf.Variable不同,Tensors可以接受tf.get_variable。这是否正确,如果是这样,当形状为Tensor时,是否有解决方法让session工作?我不希望在图形构造的这个阶段运行params_size(),因为它会使下游的许多事情变得复杂。

我尝试将cuDNN绑定用于RNN,这涉及在使用CudnnLSTM创建的模型上调用Tensor。这将在参数缓冲区中保存的参数数量返回为tf.Variable,然后将其用于创建保存参数的变量。我不想使用tf.get_variable及其所有注意事项,而是希望使用tf.get_variable来保存参数值,以便我可以使用与{{1}兼容的所有各种初始化程序轻松初始化它们。所有新机器都围绕tf.get_variable构建,因此必须返回到低级别tf.Variable非常麻烦。 tf.get_variableTensors时不接受tf.Variable似乎是Out of Memory的一个非常奇怪的限制。

1 个答案:

答案 0 :(得分:0)

解决方法是提供具有形状但具有动态形状的初始化程序。例如,而不是

install.packages("rattle", repos="http://rattle.togaware.com")

你会用

s = tf.placeholder(tf.int32, shape=())
init = tf.random_normal_initializer()
tf.get_variable('foo', shape=(s,), initializer=init) # error, shape cannot be a Tensor

但请注意,变量的初始化现在很棘手。调用s = tf.placeholder(tf.int32, shape=()) init = tf.random_normal((s,)) tf.get_variable('foo', initializer=init, validate_shape=False) 将尝试初始化tf.global_variables_initializer(),因此您需要确保它可以初始化(必要时提供一些值)或自己处理初始化。

另一种解决方法是将变量初始化为任何值(比如标量为零),然后在形状已知时将'foo'初始化为具有所需形状的值。在初始化期间使用起来要容易一些,因为初始值在fir tf.assign之后被丢弃,所以它可以是一个很好的选择。