0

Tensorflow初學者在這裏。如何避免在Tensorflow中添加重複集合?

我有一段代碼在一組圖像上進行訓練和驗證(一起)。每隔一段時間,在訓練循環中,我都會執行驗證並從驗證數據集中獲取損失。我總結了結果並使用張量板來查看我的可視化。

我的問題是,我數了兩次我的損失,我不應該。我的代碼會清楚發生了什麼

找那些已經分割爲訓練和驗證集的一些圖片,還建立了神經網絡:

 images, labels = (
      self._input_pipeline(filenames, self.model_config.BATCH_SIZE)) 
     v_images, v_labels = (
      self._input_pipeline(v_filenames, self.model_config.BATCH_SIZE)) 
     logits = self.build_nets(images) 
     tf.get_variable_scope().reuse_variables() 
     v_logits = self.build_nets(v_images) 

將損失函數:

 _ = self.set_loss(logits, labels) 
     validation_step = self.set_loss(v_logits, v_labels) 

這是set_loss樣子:

def set_loss(self, y, y_): 
    cross_entropy_sum = (
       tf.reduce_sum(tf.nn.sigmoid_cross_entropy_with_logits(logits=y, labels=y_))) 
    tf.add_to_collection('cross_entropy_loss', cross_entropy_sum) 
    return tf.losses.get_losses() 

是happenin問題克是cross_entropy_loss加入兩次到集合從而給我交叉熵損失的2倍輸出

「cross_entropy_loss」用於回主程序計​​算cross_entropy_total收集:

 get_cross_entropy = tf.get_collection('cross_entropy_loss') 
     cross_entropy_total = tf.add_n(get_cross_entropy, name='cross_entropy_loss_across_all_gpus') 
     tf.summary.scalar("cross entropy loss", cross_entropy_total) 

甲單個彙總運算生成摘要:

 summary_op = tf.summary.merge_all() 

訓練步驟看起來像這樣:

 train_step = (
      tf.train.GradientDescentOptimizer(model_config.INITIAL_LEARNING_RATE).minimize(cross_entropy_total)) 

這裏是最後一塊,運行培訓片和驗證件,寫出總結

   _, cross_entropy = sess.run([train_step, cross_entropy_total]) 
       if step % self.model_config.SUMMARY_EVERY == 0: 
        summary_str = sess.run(summary_op) 
        summary_writer.add_summary(summary_str, step) 
        #validation 
        _, cross_entropy = sess.run([validation_step, cross_entropy_total]) 
        v_summary_str = sess.run(summary_op) 
        v_summary_writer.add_summary(v_summary_str, step)       

所以有人可以幫助我如何避免計數cross_entropy_total兩次? 例如,如果不進行驗證的損失是100,如果我插入所示的驗證片以上就變成200

+0

我回答了你的問題嗎? – MaxB

+0

我想知道爲什麼你應該將驗證損失添加到cross_entropy_loss集合,然後通過它更新權重。如果該步驟用於驗證,則不應跳過該損失添加到僅包含訓練損失的集合中。 – lerner

回答

1

通常,人們喂經由feed_dict參數訓練和驗證數據到sess.run。這樣,「圖形」不依賴於數據集部分。

此外,我不清楚爲什麼你甚至需要在這裏使用「集合」。你可以喂cross_entropy_sum = tf.reduce_sum ...minimize

+0

你能指點我一個如何使用feed_dict的例子嗎? – wrecktangle

+0

@wrecktangle https://www.tensorflow.org/get_started/mnist/beginners(Crtl-F feed_dict) – MaxB

+0

另外我想盡量減少cross_entropy_total這是跨多個GPU的cross_entropy_sum,所以我怎麼能做到這一點,沒有集合? – wrecktangle