2017-04-18 106 views
3

看起來tf.get_variable不接受Tensor的形狀,只有int。這不同於tf.Variable,它可以接受Tensors。這是否正確,如果是這樣,當形狀爲Tensor時,是否有一種解決方法可以使tf.get_variable工作?我不想在圖表構建的這個階段運行session,因爲它會使下游的許多事情複雜化。tf.get_variable不接受形狀的張量

我正在嘗試使用用於RNN的cuDNN綁定,其中涉及使用CudnnLSTM創建的模型上調用params_size()。這將返回保存在參數緩衝區中的參數數量Tensor,然後用它來創建保存參數的變量。除了使用tf.Variable以及所有注意事項之外,我希望使用tf.get_variable來保存參數值,以便我可以使用與tf.get_variable等兼容的所有各種初始化程序輕鬆地初始化它們。所有新機器都圍繞tf.get_variable建造,所以不得不回到低級tf.Variable是非常麻煩的。 tf.get_variable似乎是一個非常奇怪的限制,當tf.Variable不接受Tensors

回答

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 

你會使用

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 assign之後被丟棄,所以它可能是一個好的選擇。

相關問題