2017-10-06 33 views
1

我在Ubuntu 16.04使用Keras 2.0.8與Tensorflow 1.3.0在CUDA 8.0和cuDNN 6.Keras BatchNormalization總體參數更新,而在tensorflow

我使用兩個BatchNormalization層(keras層)訓練在我的模型和培訓中使用tensorflow管道。我在這裏面臨兩個問題

-

  1. BatchNorm層總體參數(均值和方差)的未更新在訓練甚至設置K.learning_phase後。結果,推論完全失敗。我需要一些關於如何在人工培訓步驟之間更新這些參數的建議。
  2. 其次,後節約使用tensorflow 保護運算訓練的模型,當我嘗試負載吧,結果不能被複制。看起來的重量正在變化。有沒有辦法在保存加載操作中保持重量相同?
+0

我從來沒有聽說過類似的問題。在訓練時,請檢查您是否已將該圖層設置爲可學習。關於第二個問題,加載模型後權重不能改變。 –

+0

將K.learning_phase()設置爲True,其中K是後端,應該設置可學習的圖層。 如果您確定重量保持不變,您能否提出一個可能的原因,以便在加載模型後無法重現結果? –

+0

你觀察到了多少變化?如果它很小,請嘗試設置一個隨機種子。否則,我不能說。另外,爲什麼不使用'learningLearning_phase()''trainable = True'參數來使圖層學習? –

回答

0

幾周前我遇到了同樣的問題。在內部,keras圖層可以向模型添加額外的更新操作(例如batchnorm)。所以你需要明確地運行這些額外的操作。對於蝙蝠技術來說,這些更新似乎只是一些assign_ops,它將當前的均值/方差與新值交換。如果你不創建keras模型,這可能工作;假設X是你喜歡的正常化

bn = keras.layers.BatchNormalization() 
x = bn(x) 

.... 
sess.run([minimizer_op,bn.updates],K.learning_phase(): 1) 

在我的工作流程中的張量,我創建一個keras模型(W/O編譯它),然後運行以下

model = keras.Model(inputs=inputs, outputs=prediction) 
sess.run([minimizer_op,model.updates],K.learning_phase(): 1) 

其中輸入可以是類似

inputs = [keras.layers.Input(tensor=input_variables)] 

輸出是人張量張量。該模型似乎彙總了所有額外的更新之間的操作輸入輸出自動。

+0

woops,它需要是feed_dict = {K.learning_phase():1} – user3611765