keras 如何保存训练集与验证集正确率的差最小那次epoch的网络及权重

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了keras 如何保存训练集与验证集正确率的差最小那次epoch的网络及权重相关的知识,希望对你有一定的参考价值。

利用fit函数训练,一般设置callbacks.ModelCheckpoint()中的monitor和mode,决定保存最优模型。我的问题是想要保存如题那次的模型,按逻辑是自定义monitor为两个精确度的差,但是不知道如何实现,谢谢。

参考技术A 1、我认为模型是用训练数据集训练出来的,然后用验证数据集来验证就可以看出是否过度拟合 我这里是SAS9.4中文版的,使用“简单随机”抽样方法,该方法使得两个数据集没有交集,能够更好验证是否过度拟合 一种方法是比较ROC值,如果训练的比验证的。

Keras:使用批量标准化在同一数据集上的不同训练和验证结果

【中文标题】Keras:使用批量标准化在同一数据集上的不同训练和验证结果【英文标题】:Keras: Different training and validation results on same dataset using batch normalization 【发布时间】:2017-11-18 06:29:56 【问题描述】:

即使我使用相同的数据集,我的训练分类也很高,但验证分类却很低。此问题仅在使用批量标准化时发生。我是否正确实施它?

使用批量标准化的代码:

train_datagen = ImageDataGenerator(rescale=1. / 255)
train_generator = train_datagen.flow_from_directory(
directory = '../ImageFilter/Images/',
target_size=(img_rows, img_cols),
batch_size=batch_size,
class_mode='categorical',
shuffle=True)

model = Sequential()

model.add(Convolution2D(16,
kernel_size=(3, 3),
strides=(2,2),
activation='relu',
input_shape=(img_rows, img_cols, 3)))
model.add(BatchNormalization())
model.add(MaxPooling2D((2,2), strides=(2,2)))

model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dense(2, activation='softmax'))

model.compile(loss='categorical_crossentropy',
optimizer='adam',
metrics = ['accuracy'])
epochs = 100
patience = 6
n_images = 91
file_path = 'imageFilterCNN.hdf5'

checkpointer = ModelCheckpoint(file_path, monitor='val_acc', verbose=0, save_best_only=True)
earlystop = EarlyStopping(monitor='val_acc', patience=patience, verbose=0, mode='auto')
tboard = TensorBoard('./logs')

model.fit_generator(
train_generator,
steps_per_epoch=n_images// batch_size,
epochs=epochs,
callbacks=[checkpointer, earlystop, tboard],
validation_data=train_generator,
validation_steps=n_images// batch_size)

输出: 时代 15/100 11/11 [===============================] - 2s - 损失:0.0092 - acc: 1.0000 - val_loss:3.0321 - val_acc:0.5568

【问题讨论】:

这些结果有什么奇怪的地方?训练准确率永远比测试好;你有什么理由期望泛化很简单? 我正在对其进行训练的同一数据集上进行测试。所以结果应该是非常相似的。 【参考方案1】:

您正在对第一层(输入)应用批量标准化,这很可能是一个错误。你为什么要这样做?您的输入是图像,并且您非常清楚如何规范化您的输入 - 事实上,这就是您在第一行所做的。再次应用标准化是没有意义的。

批量归一化应用于隐藏层,这样数据就不会变得太大或太小。没有简单、通用的方法可以做到这一点,因此Sergey Ioffe and Christian Szegedy 引入了这个特殊层。

【讨论】:

好的。我在第一层取出了批量标准化。我仍然遇到同样的问题。当我在同一个数据集上训练和验证/测试时,我的训练结果比我的测试结果要好得多。 @mcudic 你有没有解决你的问题?你能包括你正在使用的 Keras 和 Tensorflow 的版本吗?以及 CUDA 和 CuDNN 的版本?

以上是关于keras 如何保存训练集与验证集正确率的差最小那次epoch的网络及权重的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 Keras 中使用前馈神经网络进行单独的训练、验证和测试数据集可以获得 100% 的准确率?

如何按百分比将 CSV 数据集拆分为训练集和测试集,并将拆分后的数据集与 pandas 一起保存到本地文件夹中? [复制]

Keras FAQ: 常见问题解答

验证集与测试集有啥区别?为啥要分训练集、验证集和测试集?

深度学习:带有 keras 的小型数据集:局部最小值

机器学习:验证数据集与交叉验证