我的代码如下:
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
我想知道为什么保存的最佳模型的评估与历史上最好的损失不同?
附加信息:
我尝试使用以下代码保存有关迭代和丢失的信息:
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
但是在装载了最好的型号之后:
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:的建议更新
检查洗牌=假。我更改了这一行代码:
hist = model.fit(X_train, y_train, 32, 50, callbacks=[mcp], shuffle = False) 历史:
对节省的模式的评价:
0.356727153063
最佳档案:
43_0.19047.hdf5
加载此文件后的评估:
0.373612910509
检查与验证
具有有效性的代码:
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
发布于 2017-08-08 15:52:24
因为您正在监视loss,这意味着培训数据集的丢失。验证数据集的丢失称为val_loss。我不知道这是否是您提供的实际代码,但是您不应该在您训练过的相同的数据集上进行评估。它可能不会泛化任何东西,只是开始记住输入数据,特别是在小数据集中。
为什么评估比最佳保存的训练损失更差?,这是因为损失数组是在每个时期结束时计算的,如果您有shuffle=True,那么每一个分批都会按不同的顺序计算,因此梯度的计算也会不同。这会让这件事变得不同。另一方面,评估同时处理整个集合(在batch_size批次中),但是,不要在相同的数据集上使用评估,这样就很难计算出网络的准确性。
https://stackoverflow.com/questions/45571468
复制相似问题