ConvNet 验证精度与每个 epoch 的关系
ConvNet validation accuracy relation with each epoch
训练CNN时,为什么在一个epoch中validation loss有所改善,而之前一个epoch的validation loss没有改善?我不使用任何 dropout,训练和验证数据集在每个 epoch
后保持不变
型号:
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'))
下面的示例:第 14 个时期改进了 val_loss,而第 13 个时期没有。怎么可能?这背后的直觉是什么?
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
一般来说,您会期望趋势先是改善,然后是稳定,最终可能随着过度拟合的出现而恶化。但是,验证准确性是一个嘈杂的过程。你不是直接在上面训练,所以它可能会上升或下降一点。
考虑这一点的一种方法是注意任何深度网络都描述了一个复杂的、高度非线性的函数,由大量变量参数化。在每一步,训练算法都会尝试微调这些参数,以便您的非线性函数在训练示例给出的点处具有所需的值。但是验证准确性衡量的是在一组不同的示例上的对齐情况。当然,在这个训练过程的某些阶段,训练集准确性的提高可能会导致验证集的恶化,这完全是偶然的——这将在以后的迭代中得到解决。
此外,即使是训练准确率也会波动,因为您通常在小批量上进行训练,而不是一次在整个训练集上进行训练。因此,一个特定的 minibatch 可能包含一堆示例,这些示例将函数推向一个特定的方向,而这恰好对大多数其他训练示例有害。这通常会被后续的小批量修复,但会导致训练准确率不时下降。
训练CNN时,为什么在一个epoch中validation loss有所改善,而之前一个epoch的validation loss没有改善?我不使用任何 dropout,训练和验证数据集在每个 epoch
后保持不变型号:
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'))
下面的示例:第 14 个时期改进了 val_loss,而第 13 个时期没有。怎么可能?这背后的直觉是什么?
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
一般来说,您会期望趋势先是改善,然后是稳定,最终可能随着过度拟合的出现而恶化。但是,验证准确性是一个嘈杂的过程。你不是直接在上面训练,所以它可能会上升或下降一点。
考虑这一点的一种方法是注意任何深度网络都描述了一个复杂的、高度非线性的函数,由大量变量参数化。在每一步,训练算法都会尝试微调这些参数,以便您的非线性函数在训练示例给出的点处具有所需的值。但是验证准确性衡量的是在一组不同的示例上的对齐情况。当然,在这个训练过程的某些阶段,训练集准确性的提高可能会导致验证集的恶化,这完全是偶然的——这将在以后的迭代中得到解决。
此外,即使是训练准确率也会波动,因为您通常在小批量上进行训练,而不是一次在整个训练集上进行训练。因此,一个特定的 minibatch 可能包含一堆示例,这些示例将函数推向一个特定的方向,而这恰好对大多数其他训练示例有害。这通常会被后续的小批量修复,但会导致训练准确率不时下降。