首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么使用ModelCheckpoint对保存模型的评价与训练历史中的结果不同?

为什么使用ModelCheckpoint对保存模型的评价与训练历史中的结果不同?
EN

Stack Overflow用户
提问于 2017-08-08 14:45:50
回答 1查看 832关注 0票数 2

我的代码如下:

代码语言:javascript
复制
from keras.models import Sequential
from keras.layers import Dense, Flatten, Dropout
from keras.utils import np_utils
from keras.callbacks import ModelCheckpoint
import numpy as np

best_weights_filepath = './best_weights.hdf5'

labels = np.array([1, 2]) # 0 - num_classes - 1
y_train = np_utils.to_categorical(labels, 3)
X_train = np.array([[[1, 2], [3, 4]], [[1, 2], [3, 4]]])

model = Sequential()
model.add(Flatten(input_shape=X_train.shape[1:]))
model.add(Dropout(0.2))
model.add(Dense(64))
model.add(Dropout(0.15))
model.add(Dense(32))
model.add(Dense(3, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='sgd')
mcp = ModelCheckpoint(best_weights_filepath, monitor="loss",
                      save_best_only=True)
hist = model.fit(X_train, y_train, 32, 50, callbacks=[mcp])                      
print(hist.history)
model.load_weights(best_weights_filepath)
evaluation = model.evaluate(X_train, y_train)
print(evaluation)

历史:

{“损失”:0.88553774356842041、1.3095510005950928、1.0029082298278809、0.93805015087127686、0.91467124223709106、1.2132010459899902、1.0659240484237671、0.70151412487030029、1.1300414800643921、0.94646221399307251、0.85309064388275146、0.7952626293277740479、0.7028811573982388、1.128981828686895752、0.877778840408994674683、0.6379444469833374023、0.9292929589274541016、0.63434022665023804、0.266060844349、1.133800745010376、0.45052323853、0.29425695538520813、1.233434455139、25012123123123123121231212328706706707707707707707707707707707707706、13707707707707606、13707606、13707606、13707606、1370760996、1.12586606、13707606、13707706、13707706、13707706、13707606、13707706、13707706、13707706、137606、13606、13706、137606、13706、13706、137606、137606、137606、13707606、13707606、137606、13706、13706、13706、13706、137606、1370696、13379606、1337760696、1.12586806、1337760953、0.2983888053、0.63794448853、0.637944648853、0.63794469838313813、1.2945455139、250123123303、0.612340226626804、0.266084493039349、1.133800745050376、1.133800745010376、1.1338007460600.73725700378417969,0.55782550573348999,1.0230169296264648,0.63401424884796143,0.27007108926773071,1.3010811805725098,0.58272790908813477,0.62068361043930054,0.85791635513305664,1.2364600896835327,0.55607849359512329,1.382312536239624,1.0019338133950928,0.24319441616535187,0.76683026552200317,0.99913954734802246,0.57584917545318604,0.788516283527832,1.8757588863372803}

对节省的模式的评价:

0.698137879372

我想知道为什么保存的最佳模型的评估与历史上最好的损失不同?

附加信息:

我尝试使用以下代码保存有关迭代和丢失的信息:

代码语言:javascript
复制
mcp = ModelCheckpoint(filepath='./{epoch:d}_{loss:.5f}.hdf5', monitor="loss",
                      save_best_only=True)

并有下一个文件:

0_1.71130.hdf5 2_0.39069.hdf5 17_0.25475.hdf5 20_0.15824.hdf5

与培训产出相对应:

21/50 2/2 ============================== -0-损失: 0.1582

但是在装载了最好的型号之后:

代码语言:javascript
复制
best_weights_filepath = "20_0.15824.hdf5"
model.load_weights(best_weights_filepath)
evaluation = model.evaluate(X_train, y_train)
print(evaluation)

结果:

0.792584061623

通过Josef:的建议更新

检查洗牌=假。我更改了这一行代码:

代码语言:javascript
复制
hist = model.fit(X_train, y_train, 32, 50, callbacks=[mcp], shuffle = False) 

历史:

对节省的模式的评价:

0.356727153063

最佳档案:

43_0.19047.hdf5

加载此文件后的评估:

0.373612910509

检查与验证

具有有效性的代码:

代码语言:javascript
复制
from keras.models import Sequential
from keras.layers import Dense, Flatten, Dropout
from keras.utils import np_utils
from keras.callbacks import ModelCheckpoint
import numpy as np

best_weights_filepath = './best_weights.hdf5'

train_labels = np.array([1, 2]) # 0 - num_classes - 1
y_train = np_utils.to_categorical(train_labels, 3)
X_train = np.array([[[1, 2], [3, 4]], [[2, 1], [4, 3]]])

test_labels = np.array([0, 2]) # 0 - num_classes - 1
y_test = np_utils.to_categorical(test_labels, 3)
X_test = np.array([[[2, 2], [3, 3]], [[1, 1], [4, 4]]])

model = Sequential()
model.add(Flatten(input_shape=X_train.shape[1:]))
model.add(Dropout(0.2))
model.add(Dense(64))
model.add(Dropout(0.15))
model.add(Dense(32))
model.add(Dense(3, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='sgd')
mcp = ModelCheckpoint(filepath=best_weights_filepath, monitor='val_loss',
                      save_best_only=True)
hist = model.fit(X_train, y_train, validation_data=(X_test, y_test), nb_epoch=50, callbacks=[mcp], shuffle = False)
print(hist.history)
model.load_weights(best_weights_filepath)
evaluation = model.evaluate(X_test, y_test)
print(evaluation)
print(model.metrics_names)

历史:

2.679440975189209,2.5890841484069824,2.7041923999786377,2.6547081470489502,2.6690154075622559}

对节省的模式的评价:

1.09120941162

它看起来很适用于验证

查阅档案:

4_2.19177.hdf5

加载此文件后的评估:

2.19177055359

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-08 15:52:24

因为您正在监视loss,这意味着培训数据集的丢失。验证数据集的丢失称为val_loss。我不知道这是否是您提供的实际代码,但是您不应该在您训练过的相同的数据集上进行评估。它可能不会泛化任何东西,只是开始记住输入数据,特别是在小数据集中。

为什么评估比最佳保存的训练损失更差?,这是因为损失数组是在每个时期结束时计算的,如果您有shuffle=True,那么每一个分批都会按不同的顺序计算,因此梯度的计算也会不同。这会让这件事变得不同。另一方面,评估同时处理整个集合(在batch_size批次中),但是,不要在相同的数据集上使用评估,这样就很难计算出网络的准确性。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45571468

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档