2017-08-01 147 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