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_variable
在Tensors
时不接受tf.Variable
似乎是Out of Memory
的一个非常奇怪的限制。
答案 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
之后被丢弃,所以它可以是一个很好的选择。