2017-09-09 87 views
2

我從.json.hdf5文件加載Keras模型。當我打電話model.evaluate(),它返回一個錯誤:需要在`model.evaluate()`之前編譯keras模型`

You must compile a model before training/testing. Use `model.compile(optimizer, loss)

爲什麼我需要編譯運行evaluate()

要添加,該模型可以通過predict()沒有問題。

+0

你用'load_weights()'加載模型嗎? __HDF5__格式用於嚴格保存權重。你能否提供代碼?謝謝。 –

+0

您使用的是Keras版本? –

回答

3

因爲evaluate會計算損失函數和度量

在編譯模型之前,您沒有其中任何一個。他們參數編譯方法:

model.compile(optimizer=..., loss=..., metrics=...) 

在另一方面,predict不評價任何指標或損失,它只是通過模型通過對輸入數據,並得到其輸出。

您也需要「損失」進行培訓,因此您無法編譯而無法進行培訓。您可以根據需要多次編譯模型,甚至可以更改參數。


的輸出和損耗函數:

該模型的輸出依賴於它正在與重量定義。這是自動的,你可以從任何型號的predict,即使沒有任何培訓。 Keras中的每個模型都已經生成了重量(由您初始化或隨機初始化)

您輸入了一些內容,模型會計算輸出。在所有事情的最後,這都是重要的。一個好的模型具有適當的權重並正確地輸出東西。

但在實現這一目標之前,您的模型需要接受培訓。

現在,損失函數將獲取當前輸出並將其與期望/真實結果進行比較。這是一個應該儘量減少的功能。損失越少,結果越接近預期。這是導出衍生物的函數,所以反向傳播算法可以更新權重。

損失函數對模型的最終目的沒有用處,但對於培訓是必需的。這可能就是爲什麼你可以擁有沒有損失函數的模型(因此,沒有辦法評估它們)。

+0

你介意解釋爲什麼在https://github.com/JihongJu/keras-fcn/blob/master/voc2011/infer.py,沒有必要編譯調用model.evaluate? load_model(fcn_vgg16_weights.h5)以某種方式包含了丟失函數? – bhomass

+0

不幸的是,我從未能夠在Keras中保存和加載模型,我不知道會發生什麼。對我來說,這完全是越野車,我只能保存重量。但理論上,是的,可以通過其損失函數和優化程序狀態來保存模型。但這並不意味着每個保存的模型都會像這樣保存。 –

+0

@bhomass是的,'load_model()'函數實際上有一個'模型。編譯()'裏面的調用。只要模型在保存之前編譯完成,它將在加載時自動重新編譯。 –