Tensorflow KerasRegressor - 正确读取设置“verbose=2”输出

问题描述

...
Epoch 7/10
91/91 - 0s - loss: 84.1231
Epoch 8/10
91/91 - 0s - loss: 65.1705
Epoch 9/10
91/91 - 0s - loss: 53.3347
Epoch 10/10
91/91 - 0s - loss: 45.4169
**11/11 - 0s - loss: 15.8337**
Epoch 1/10
91/91 - 0s - loss: 611.2643
Epoch 2/10
91/91 - 0s - loss: 563.0521
Epoch 3/10
91/91 - 0s - loss: 460.6799
Epoch 4/10
91/91 - 0s - loss: 330.3016
Epoch 5/10
91/91 - 0s - loss: 215.1095
Epoch 6/10
91/91 - 0s - loss: 137.6284
Epoch 7/10
91/91 - 0s - loss: 93.3648
Epoch 8/10
91/91 - 0s - loss: 69.6211
Epoch 9/10
91/91 - 0s - loss: 55.6200
Epoch 10/10
91/91 - 0s - loss: 46.7145
**11/11 - 0s - loss: 19.7976**
Epoch 1/10
91/91 - 0s - loss: 533.4615
Epoch 2/10
91/91 - 0s - loss: 510.9247
Epoch 3/10
91/91 - 0s - loss: 459.0772
Epoch 4/10
91/91 - 0s - loss: 368.3991
Epoch 5/10
91/91 - 0s - loss: 259.9857
Epoch 6/10
91/91 - 0s - loss: 168.8091
Epoch 7/10
91/91 - 0s - loss: 108.7919
Epoch 8/10
91/91 - 0s - loss: 74.7730
Epoch 9/10
91/91 - 0s - loss: 56.3438
Epoch 10/10
91/91 - 0s - loss: 46.0458
**11/11 - 0s - loss: 107.8788**
...

我正在使用“verbose=2”运行 Tensorflow KerasRegressor。除了用**括起来的行外,我理解大部分输出。它在所有 epoch 执行后出现,并且总是有奇怪的损失。我首先想到的是所有时期的平均损失,但显然不是。

谁能详细说明一下。谢谢! :)

代码如下:

import pandas
from keras.models import Sequential
from keras.layers import Dense
from keras.wrappers.scikit_learn import KerasRegressor
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import KFold
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline

# load dataset
url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/housing.data'
df = pandas.read_csv(url,delim_whitespace=True,header=None)
dataset = df.values
# split into input (X) and output (Y) variables
X = dataset[:,0:13]
Y = dataset[:,13]

# define base model
def baseline_model():
    # create model
    model = Sequential()
    model.add(Dense(13,input_dim=13,kernel_initializer='normal',activation='relu'))
    model.add(Dense(1,kernel_initializer='normal'))
    # Compile model
    model.compile(loss='mean_squared_error',optimizer='adam')
    return model

%%time
# evaluate model with standardized dataset
estimators = []
estimators.append(('standardize',StandardScaler()))
estimators.append(('mlp',KerasRegressor(build_fn=baseline_model,epochs=10,batch_size=5,verbose=2)))
pipeline = Pipeline(estimators)
kfold = KFold(n_splits=10)
results = cross_val_score(pipeline,X,Y,cv=kfold)
print("Standardized: %.2f (%.2f) MSE" % (results.mean(),results.std()))

这是 GoogleColab 代码链接https://colab.research.google.com/drive/1b8YUV4ZWMizrF5-kWRMJkiZYqu-iToGx?usp=sharing

解决方法

这似乎是验证损失。 cross_val_score 在未提供分数参数时调用估算器的默认评分器(请参阅 the docs)。 Keras 回归器的 score function 返回测试损失,并且可能以 verbosity=2 打印它。这个函数只是调用model.evaluate(),它的行为就像你在verbosity=2 中看到的一样。

正如评论中提到的,由于各种原因,预计测试/验证损失通常与训练损失不同。与看不见的数据相比,过拟合/欠拟合会使模型在训练期间看到的数据上表现不同。此外,较小的测试集可能意味着它看起来与训练集不同,因此会有不同的拟合分数。参见例如this question