在培训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
答案 0 :(得分:0)
一般来说,你会发现趋势是改善,然后趋于稳定,最终可能随着过度拟合而恶化。然而,验证准确性是一个嘈杂的过程。你不是直接训练它,所以它可能会上下移动一点。
考虑到这一点的一种方法是要注意,任何深度网络都描述了一个复杂的,高度非线性的函数,由大量变量参数化。在每个步骤中,训练算法都会尝试微调这些参数,以便您的非线性函数在训练示例给出的点处具有所需的值。但验证准确性衡量的是一组不同的例子。在训练过程的某些阶段,训练集的准确性的提高肯定会导致验证集的恶化,纯粹是偶然的 - 并且这将在以后的迭代中得到修复。
此外,即使训练准确性也会波动,因为您通常会使用迷你训练班,而不是立即训练整个训练组。因此,特定的迷你游戏可能包含一系列示例,这些示例在特定方向上轻推功能,这恰好对大多数其他训练示例有害。这通常会被后续的小型游戏机修复,但可能并且会导致训练准确性不时下降。