tf.get_variable不接受形状的张量

Moh*_*shi 5 tensorflow

似乎只tf.get_variable接受Tensor形状int.这是不同的tf.Variable,可以接受Tensors.这是正确的,如果是这样,tf.get_variable当形状是Tensor什么时,是否有一种解决方法可以开始工作?我不想session在图形构造的这个阶段运行,因为它会使下游的许多事情复杂化.

我正在尝试使用针对RNN的cuDNN绑定,这涉及调用params_size()使用创建的模型CudnnLSTM.这将在参数缓冲区中保存的参数数量作为a返回Tensor,然后用于创建保存参数的变量.而不是使用tf.Variable它的所有警告,我想tf.get_variable用来保存参数值,这样我就可以使用兼容的所有各种初始化器轻松初始化它们tf.get_variable等等.所有新机器都围绕着tf.get_variable,所以必须回到低级别tf.Variable是非常繁琐的.这似乎是一个非常奇怪的限制,tf.get_variable不接受Tensors什么tf.Variable时候.

P-G*_*-Gn 0

解决方法是提供一个具有形状但动态的初始值设定项。例如,而不是

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
Run Code Online (Sandbox Code Playgroud)

你会用

s = tf.placeholder(tf.int32, shape=())
init = tf.random_normal((s,))
tf.get_variable('foo', initializer=init, validate_shape=False)
Run Code Online (Sandbox Code Playgroud)

但请注意,变量的初始化现在很棘手。调用tf.global_variables_initializer()将尝试初始化'foo',因此您需要确保它可以被初始化(如果需要的话提供一些值)或自己处理初始化。

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