2017-09-24 18 views
1

我有Keras神經網絡,並且使用checkpoint回調來保存模型,只要它超過了之前的驗證分數。我如何在Keras上保存的模型重新運行驗證

我可以加載模型早在很輕鬆地使用

model = keras.models.load_model("savedcheckpointfilename.h5") 

然後我想保存的模型之前,從上次劃時代提取lossval_loss值。

我該怎麼做?

我已經嘗試過運行另一個培訓時代,但是我想這會改變權重。我不清楚到底使用了什麼驗證集,因爲Keras在訓練過程中自動化了這個驗證集,因此看不到我如何運行明確的預測與驗證數據(作爲訓練集的哪部分保留用於驗證未公開)AFAICS )。

+1

從一點挖掘,它看起來像我可以保存從fit函數返回的歷史記錄,至少看到歷史,但我仍然希望能夠重新評估驗證。看起來歷史對象也將驗證數據存儲在驗證字段中,但尚不清楚如何將其傳遞到預測/評估中。 –

+1

我不知道驗證數據是什麼;我將一個訓練集和一個validation_split(0.1)傳遞給Keras的fit()函數。理論上,我可以使用fit的validation_data參數傳入我自己的validation_data,但是在窗口中存在一個錯誤,因爲這不起作用,因此使用validation_data而不是validation_split對我來說不是一個可行的解決方法。我將嘗試挖掘該錯誤的參考,無論哪種方式,在使用validation_split方法時如何重新評估驗證損失是個合法的問題。 –

回答

1

Keras似乎將作爲驗證拆分的數據的最後部分。

因此,如果手動與您在model.fit(... validation_split= <your ratio here>)定義你可以隨時後來得到您的確認數據,並做了簡單的model.evaluate()與值完全相同分割訓練數據。

我剛剛與Pima Indians Example驗證,它的工作原理:

培訓:大紀元1/1 250/250 - 0 - 虧損:val_loss:0.6712 - val_acc:0.6560

型號評估完成與手動拆分 - ETA:0s _損失:0.6712%_ acc:0.6560%

分裂點需要t如果不在整數邊界上,則向上取整。

def checkValScore(modelFile, X_train, Y_train, split=0.1) : 

    model = keras.models.load_model(modelFile) 
    split = -int(math.ceil(X_train.shape[0]* split)) 
    X_cv = np.array(X_train)[split:] 
    Y_cv = np.array(Y_train)[split:] 
    return model.evaluate(X_cv, Y_cv) 
+1

非常感謝!今天晚些時候我會檢查一下。 –

+1

謝謝!如果不在整數邊界上,這與小問題有關,您需要將驗證集分數舍入。我已經修改了你的答案以反映這一點,如果你沒事的話,我會把它標記好。 –

+0

@TomWalker太好了。很高興你能解決它!當然:感謝編輯,沒關係。 – petezurich