python - KeyError 的问题:'val_acc'
问题描述
这是一个相当流行的错误,但鉴于我的设置,我找不到正确的答案。我找到了这个教程代码,但是在运行时,我得到了这个错误:
val_acc = history.history['val_acc']
KeyError: 'val_acc'
与 , 不同的fit_generator()
函数fit()
不允许验证拆分。那么如何解决呢?
这是代码:
def plot_training(history):
print (history.history.keys())
acc = history.history['acc']
val_acc = history.history['val_acc']
loss = history.history['loss']
val_loss = history.history['val_loss']
epochs = range(len(acc))
plt.plot(epochs, acc, 'r.')
plt.plot(epochs, val_acc, 'r')
plt.title('Training and validation accuracy')
# plt.figure()
# plt.plot(epochs, loss, 'r.')
# plt.plot(epochs, val_loss, 'r-')
# plt.title('Training and validation loss')
plt.show()
plt.savefig('acc_vs_epochs.png')
#....
finetune_model = build_finetune_model(base_model, dropout=dropout, fc_layers=FC_LAYERS, num_classes=len(class_list))
adam = Adam(lr=0.00001)
finetune_model.compile(adam, loss='categorical_crossentropy', metrics=['accuracy'])
filepath="./checkpoints/" + "ResNet50" + "_model_weights.h5"
checkpoint = ModelCheckpoint(filepath, monitor=["acc"], verbose=1, mode='max')
callbacks_list = [checkpoint]
history = finetune_model.fit_generator(train_generator, epochs=NUM_EPOCHS, workers=8,
steps_per_epoch=steps_per_epoch,
shuffle=True, callbacks=callbacks_list)
plot_training(history)
解决方案
嗨,在这里写下我的建议,因为我还不能发表评论,
您是对的,该功能fit_generator()
没有验证拆分属性。因此,您需要制作自己的验证数据集并将其提供给 fit 生成器validation_data=(val_X, val_y)
,例如:
history = finetune_model.fit_generator(train_generator, epochs=NUM_EPOCHS, workers=8, validation_data=(val_X, val_y),
steps_per_epoch=steps_per_epoch,
shuffle=True, callbacks=callbacks_list)
希望这可以帮助。
编辑
要从您的数据中获取验证数据集,您可以使用train_test_split()
sklearn 中的方法。例如,具有 77% 训练数据和 33% 验证数据的拆分:
X_train, val_X, y_train, val_y= train_test_split(
X, y, test_size=0.33, random_state=42)
在这里查看更多信息。
或者,您可以编写自己的拆分方法 :)
编辑 2
如果您无法使用 train_test 拆分,并且假设您有一个train_data
带有特征和标签的 pandas 数据框:
val_data=train_data.sample(frac=0.33,random_state=1)
这应该会创建一个包含 33% 数据的验证数据集和一个包含 77% 数据的训练数据集。
编辑3
事实证明,您正在使用它ImageDataGenerator()
来创建数据。这非常方便,因为您可以validation_split=
在初始化 ImageDataGenerator() 时设置验证百分比,如文档(此处)中所示。这应该看起来像这样:
train_datagen = ImageDataGenerator(preprocessing_function=preprocess_input,
validation_split=0.33)
在此之后,您需要两个“生成的”数据集。一个用来训练,一个用来验证。这应该如下所示:
train_generator = train_datagen.flow_from_directory(TRAIN_DIR,
target_size=(HEIGHT, WIDTH),
batch_size=BATCH_SIZE,subset="training")
validation_generator = train_datagen.flow_from_directory(TRAIN_DIR,
target_size=(HEIGHT, WIDTH),
batch_size=BATCH_SIZE,subset="validation")
最后,您可以在 fit_generator 中使用这两个集合,如下所示:
history = finetune_model.fit_generator(train_generator,epochs=NUM_EPOCHS, workers=8,
validation_data=validation_generator, validation_steps = validation_generator.samples,steps_per_epoch=steps_per_epoch,
shuffle=True, callbacks=callbacks_list)
让我知道这是否解决了您的问题:)
推荐阅读
- ios - 禁用 UIAlertController 文本的字体缩放
- python - 如何使用 Python 检索具有用户输入的 Excel 工作表中的匹配值
- sql - 不明确的列和计数
- apache - SVN + Apache HTTPD - 使用 Jenkins 多次结帐后出现 500 内部服务器错误
- python - 这个 1 在下面的代码中代表什么?
- react-native - 如何在本机反应中在 Alert.alert() 上应用样式?
- apache - Debian 8 Apache 2.4.10 ErrorDocument 重载不起作用
- python - 如何使用 datetime.strptime 解析 '2020-07-30T20:40:33.1000000Z'
- c++ - 在 C++ 中保留列表列表
- javascript - 检查类构造函数是否定义了方法