2017-05-21 60 views
1

我使用TensorFlow的python API來訓練LSTM的變體。 爲此,我使用tf.while_loop函數遍歷時間步長。GPU上的TensorFlow nullptr檢查失敗

當在CPU上運行我的腳本,它不會產生任何錯誤消息,但在GPU蟒蛇崩潰是由於:

...tensorflow/tensorflow/core/framework/tensor.cc:885] Check failed: nullptr != b.buf_ (nullptr vs. 00...)

我的代碼的一部分,導致了這個錯誤(當註釋出來,它的工作原理)是在while循環的主體:

... 
h_gathered = h_ta.gather(tf.range(time)) 
h_gathered = tf.transpose(h_gathered, [1, 0, 2]) 
syn_t = self.syntactic_weights_ta.read(time)[:, :time] 
syn_t = tf.expand_dims(syn_t, 1) 
syn_state_t = tf.squeeze(tf.tanh(tf.matmul(syn_t, h_gathered)), 1) 
... 

time其中零是基於和在每個步驟之後遞增,h_ta是TensorArray

h_ta = tf.TensorArray(
     dtype=dtype, 
     size=max_seq_len, 
     clear_after_read=False, 
     element_shape=[batch_size, num_hidden], 
     tensor_array_name="fw_output") 

self.syntactic_weights_ta也是TensorArray

self.syntactic_weights_ta = tf.TensorArray(
     dtype=dtype, 
     size=max_seq_len, 
     tensor_array_name="fw_syntactic_weights") 
self.syntactic_weights_ta = self.syntactic_weights_ta.unstack(syntactic_weights) 

我試圖在代碼片段實現基本上是在過去的輸出,存儲在h_ta加權總和。 最後,我用tf.train.AdamOptimizer來訓練網絡。

我又測試了劇本,但這次在while循環設置爲False,它工作在GPU上爲好,但我真的很想知道爲什麼它不與swap_memory=True工作swap_memory參數。

回答

0

這看起來像TensorArray的張量存儲機制與swap_memory = True時由while_loop執行的分配魔術交互的方式中的一個錯誤。

你可以在TF的github上打開一個問題嗎?還請包括:

  • 一個完整的堆棧跟蹤(用-c TF內置DBG preferrable)
  • 一個最小的代碼示例重現
  • 描述該問題是否需要你要調用backprop。
  • 是否可以在TF 1.2/nightlies/master分支中重現。

並回應這裏的鏈接到github問題?

+0

我已經打開了一個https://github.com/tensorflow/tensorflow/issues/10083,但不幸的是無法按照您的要求進行詳細說明。我不知道如何在Windows 10上使用調試選項進行構建。關於最小代碼示例,我會盡量延長我發佈的代碼,以便獲得時間。 – hatero