ConvNet验证与每个时期的准确性关系
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ConvNet验证与每个时期的准确性关系相关的知识,希望对你有一定的参考价值。
在培训CNN时,为什么验证损失会在一个时代得到改善,即使它之前的验证损失没有改善?我不使用任何辍学,每个时代后训练和验证数据集保持不变
模型:
model = Sequential()
model.add(Conv2D(filters=16, kernel_size=2, padding='same', activation='relu',
input_shape=(32, 32, 3)))
model.add(MaxPooling2D(pool_size=2))
model.add(Conv2D(filters=32, kernel_size=2, padding='same', activation='relu'))
model.add(Conv2D(filters=64, kernel_size=2, padding='same', activation='relu'))
#model.add(Dropout(0.3))
model.add(MaxPooling2D(pool_size=2))
model.add(Conv2D(filters=64, kernel_size=2, padding='same', activation='relu'))
model.add(Conv2D(filters=64, kernel_size=2, padding='same', activation='relu'))
#model.add(Dropout(0.3))
model.add(MaxPooling2D(pool_size=2))
#model.add(Dropout(0.3))
model.add(Flatten())
model.add(Dense(500, activation='relu'))
model.add(Dropout(0.4))
model.add(Dense(10, activation='softmax'))
以下示例:epoch 14改进了val_loss而epoch 13没有改进val_loss。怎么可能?这背后的直觉是什么?
Epoch 12/20
Epoch 00011: val_loss did not improve
14s - loss: 1.1619 - acc: 0.6079 - val_loss: 1.2863 - val_acc: 0.5308
Epoch 13/20
Epoch 00012: val_loss did not improve
14s - loss: 1.1741 - acc: 0.6029 - val_loss: 1.3020 - val_acc: 0.5930
Epoch 14/20
Epoch 00013: val_loss improved from 1.11924 to 0.97569, saving model to model.weights.best.hdf5
14s - loss: 1.1895 - acc: 0.6005 - val_loss: 0.9757 - val_acc: 0.6614
答案
一般来说,你会发现趋势是改善,然后趋于稳定,最终可能随着过度拟合而恶化。然而,验证准确性是一个嘈杂的过程。你不是直接训练它,所以它可能会上下移动一点。
想到这一点的一种方法是要注意,任何深度网络都描述了一个复杂的,高度非线性的函数,由大量变量参数化。在每个步骤中,训练算法都会尝试微调这些参数,以便您的非线性函数在训练示例给出的点处具有所需的值。但验证准确性衡量的是一组不同的例子。在训练过程的某些阶段,训练集的准确性的提高肯定会导致验证集的恶化,纯粹是偶然的 - 并且这将在以后的迭代中得到修复。
此外,即使训练准确性也会发生波动,因为您通常会使用小批量训练,而不是立即训练整个训练集。因此,特定的迷你游戏可能包含一系列示例,这些示例在特定方向上轻推功能,这恰好对大多数其他训练示例有害。这通常由后续的小批量修复,但可以并且将导致训练准确性不时下降。
以上是关于ConvNet验证与每个时期的准确性关系的主要内容,如果未能解决你的问题,请参考以下文章
第二个时期的初始损失与第一个时期的最终损失并不一致。每个时期的损失和准确度保持不变
如何将 Tensorflow 数据集 API 与训练和验证集一起使用