2016-11-27 57 views
3

我終於用我的LSTM模型來預測事情。但是,我遇到了一個我不太明白的新問題。如果我嘗試使用預測的東西Tensorflow爲每個會話運行創建一組新的已有變量?

sess.run(pred, feed_dict={x: xs}) 

它的第一個預測的偉大工程,但任何後續預測拋出錯誤:

ValueError: Variable weight_def/weights already exists, disallowed. Did you mean to set reuse=True in VarScope?

現在,有關於這個主題的TON - 最它們很容易通過做它所要求的來解決 - 只需在違規行的周圍創建一個變量範圍,並使變量重用爲真。現在,如果我這樣做,我會得到以下錯誤:

ValueError: Variable rnn_def/RNN/BasicLSTMCell/Linear/Matrix does not exist, or was not created with tf.get_variable(). Did you mean to set reuse=None in VarScope?

這使我非常頭疼。我一遍又一遍地讀了Tensorflow Variable Sharing文檔,而且我不能在我的生活中弄清楚我做錯了什麼。這裏有罪行

with tf.variable_scope("rnn_def"): 
      outputs, states = rnn.rnn(self.__lstm_cell, 
             self.__x, 
             dtype=tf.float32) 
      self.__outputs = outputs 
      self.__states = states 

我有這個代碼嵌套在一個更大的類,只包含圖的其餘部分。爲了訓練它,我只是一遍又一遍地調用我的「火車」方法。這似乎工作得很好,問題結果是預測

所以我的問題是雙重的:

  1. 爲什麼我需要某種形式的共享變量只第一預測之後,但在第一次調用不會失敗?我需要什麼來修復這段代碼,這樣我可以預測不止一次而不會導致錯誤?

  2. 什麼時候變量共享很有用,爲什麼Tensorflow每次運行時都會創建新變量?我怎樣才能防止這種情況(我想阻止它?)?

謝謝!

+0

你在jupiter筆記本里面運行嗎?如果使用默認圖形,則每次運行單元格時都會將變量再次添加到圖形中。 – fabrizioM

+0

@fabrizioM我不是,我只是從命令行調用它。 – rec

回答

2

將打印語句添加到該代碼塊。我懷疑它被多次調用。或者,也許你正在創建類的多個實例,其中每個類都應該有自己的作用域名稱。

要回答你的問題。

Why do I require some sort of variable sharing only after the first prediction but the first call doesn't fail? What do I need to fix this code so I can predict more than once without causing an error?

不,你不知道。創建RNN的代碼塊可能被無意中稱爲多次。

When is variable sharing useful, and why is Tensorflow creating new variables each time I run it? How can I prevent this (do I want to prevent it?)?

它是在以下情況下我有不同的輸入源取決於是否是我的圖的一部分有用的訓練或預測。

x_train, h_train = ops.sharpen_cell(x_train, h_train, 2, n_features, conv_size, n_convs, conv_activation, 'upsampler') 
self.cost += tf.reduce_mean((x_train - y_train) ** 2) 

level_scope.reuse_variables() 

x_gen, h_gen = ops.sharpen_cell(x_gen, h_gen, 2, n_features, conv_size, n_convs, conv_activation, 'upsampler') 
self.generator_outputs.append(tf.clip_by_value(x_gen, -1, 1)) 

在這個例子中,重複使用與培訓師一起訓練的發電機的變量。如果你想在循環中展開和RNN,這也很有用。如在這種情況下...

y = #initial value 
state = #initial state 
rnn = #some sort of RNN cell 
with tf.variable_scope("rnn") as scope: 
    for t in range(10): 
    y, state = rnn(y, state) 
    scope.reuse_variabled() 

在這種情況下它會重複使用這對於RNN所期望的行爲的時間步長之間的RNN權重。

+0

嘿,這工作得很好!我現在有同樣的問題,除了它現在在重量範圍內發生。它似乎是以我每次調用運行時爲中心嘗試創建一個NEW變量。這是否會成爲重用變量的一種情況,因爲它現在試圖預測而不是現在的火車? – rec

+0

我猜我現在困惑的地方在於預測和訓練之間的區別,以及爲什麼當我調用預測器運行時,而不是調用優化器上的運行時,它會嘗試重新創建具有不同權重/偏移等的圖。如果您可以在此添加解釋,我很樂意將此標記爲完全正確的答案。 – rec

+0

它不應該。將打印語句直接放在您打電話給rnn.rnn的地方。我敢打賭,這段代碼被稱爲兩次。 – chasep255

相關問題