2017-08-01 150 views
0

Keras的evaluate函數讓我非常困惑。所有我想要計算我的測試集的MSE損失:Keras model.evaluate不正確的形狀

def iterate_and_store(optimizer, nepochs=10): 
    model = Sequential() 
    model.add(Dense(output_dim=8, input_dim=3, init="glorot_normal")) 
    model.add(Activation("softplus")) 
    model.add(Dense(output_dim=16, init="glorot_normal")) 
    model.add(Activation("softplus")) 
    model.add(Dense(output_dim=32, init="glorot_normal")) 
    model.add(Activation("softplus")) 
    model.add(Dense(output_dim=32, init="glorot_normal")) 
    model.add(Activation("softplus")) 
    model.add(Dense(output_dim=16, init="glorot_normal")) 
    model.add(Activation("softplus")) 
    model.add(Dense(output_dim=1)) 
    model.add(Activation("softplus")) 

    model.compile(loss='MSE', optimizer=optimizer) 

    training_loss = pd.DataFrame(model.fit(input_train, output_train, nb_epoch=nepochs, batch_size=32, verbose=2).history) 
    self_pred = pd.DataFrame(model.predict(input_train), columns=['estimated']) 
    test_pred = pd.DataFrame(model.predict(input_test), columns=['y_hat']) 
    test_loss = pd.DataFrame(model.evaluate(output_test, test_pred, verbose=2)) 

然而,線test_loss = pd.DataFrame(model.evaluate(output_test, test_pred, verbose=2))引發此錯誤: ValueError: Error when checking model input: expected dense_input_40 to have shape (None, 3) but got array with shape (10000, 1)

不應該evaluate方法計算預測之間的MSE誤差和測試集的實際輸出?

這些是我的訓練&測試輸入和輸出看起來像在形狀方面:

input_test.shape 
Out[152]: (10000, 3) 
output_test.shape 
Out[153]: (10000, 1) 
input_train.shape 
Out[154]: (10000, 3) 
output_train.shape 
Out[155]: (10000, 1) 

我試着喂model.evaluate方法的輸入和輸出,但沒有工作的每一個組合。我所有的數據都是10,000行,輸入是3個變量,1個輸出是連續的。

我只想來比較去訓練更低的損耗和更低的測試損失,應該是有點凹這樣的: enter image description here

+0

號'評價)的參數()'是一樣的'擬合(',也就是'model.evaluate(input_test,output_test)'。閱讀[doc](https://keras.io/models/model/#evaluate)。 –

+0

使用你的建議給出了下面的熊貓錯誤:'PandasError:DataFrame構造函數沒有正確調用!'儘管我不知道爲什麼,因爲所有的數據都是numpy數組 – guy

+0

'model.evaluate()'返回一個標量,如果沒有'metrics'選項在編譯模型時給出。一個'pandas.DataFrame'不能由標量構造。順便說一句,解決這個問題並沒有幫助,因爲它在每個紀元只給出最終的MSE而不是MSE。以我的答案爲例。 –

回答

3

如果你想產生這樣一個圖表,儘量提供validation_datamodel.fit(),使得在每個時期的測試集MSE 將被保存到History對象中。

例如,

history_obj = model.fit(input_train, output_train, validation_data=(input_test, output_test)) 
print(pd.DataFrame(history_obj.history)) 

應該給你這樣的事情:

 loss val_loss 
0 0.234606 0.171870 
1 0.219808 0.172064 
2 0.208841 0.173415 
3 0.202653 0.175946 
4 0.199899 0.178934 
5 0.195881 0.180141 
6 0.192053 0.179317 
7 0.189094 0.178707 
8 0.185856 0.176857 
9 0.182251 0.173282 
+0

正是我在找的,謝謝! – guy