【问题标题】:Tensorflow KerasRegressor - reading the setting 'verbose=2' output correctlyTensorflow KerasRegressor - 正确读取设置'verbose = 2'输出
【发布时间】:2021-04-03 13:41:21
【问题描述】:
...
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 如何调用估计器的拟合函数
  • 我猜这与kfold = KFold(n_splits=2) 有关。它出现在每次拆分的末尾,但是为什么每次损失值都这么偏...
  • 如果是验证损失,预计与训练损失不完全相同。造成这种情况的原因是过拟合/欠拟合或测试集的大小较小,因此在统计上与训练集不同。参见例如this question
  • 请在问题本身中包含代码,而不是作为外部链接。

标签: tensorflow keras scikit-learn verbose


【解决方案1】:

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

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

【讨论】:

  • 是的,但差异可以完全消除,例如 11.6414 和 97.7314。是不是太过分了。
猜你喜欢
  • 2018-07-01
  • 2017-12-28
  • 2013-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多