首页 文章

ConvNet验证与每个时期的准确性关系

提问于
浏览
0

在培训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

1 回答

  • 0

    一般来说,你会发现趋势是改善,然后趋于稳定,最终可能随着过度拟合而恶化 . 然而,验证准确性是一个嘈杂的过程 . 你不是直接训练它,所以它可能会上下移动一点 .

    想到这一点的一种方法是要注意,任何深度网络都描述了一个复杂的,高度非线性的函数,由大量变量参数化 . 在每个步骤中,训练算法都会尝试微调这些参数,以便您的非线性函数在训练示例给出的点处具有所需的值 . 但验证准确性衡量的是一组不同的例子 . 在训练过程的某些阶段,训练集的准确性的提高肯定会导致验证集的恶化,纯粹是偶然的 - 并且这将在以后的迭代中得到修复 .

    此外,即使训练准确性也会发生波动,因为您通常会使用小批量训练,而不是立即训练整个训练集 . 因此,特定的迷你游戏可能包含一系列示例,这些示例在特定方向上轻推功能,这恰好对大多数其他训练示例有害 . 这通常由后续的小批量修复,但可以并且将导致训练准确性不时下降 .

相关问题