为啥在第一个 epoch 验证准确度高于训练准确度?

Posted

技术标签:

【中文标题】为啥在第一个 epoch 验证准确度高于训练准确度?【英文标题】:Why at first epoch validation accuracy is higher than training accuracy?为什么在第一个 epoch 验证准确度高于训练准确度? 【发布时间】:2020-11-02 07:51:29 【问题描述】:

我正在处理 5 个类别的视频分类,并使用 TimeDistributed CNN + RNN 模型。训练数据集包含 70 个视频,每个视频包含 20 帧。验证数据集包含 15 个视频,每个视频包含 20 帧。测试数据集包含 15 个视频,每个视频包含 20 帧。我使用的批量大小是 64。所以,我总共处理了 500 个视频。我使用 RmsProp 优化器和分类 cross_entropy 损失编译了模型。

我已经用 65 个 epoch 训练了模型。但我注意到一个奇怪的事实,即验证准确度在第一个 epoch 时比训练准确度更高。但是,在其余的 epoch 中,曲线看起来非常令人满意。

我的模型是:

model = Sequential()

input_shape=(20, 128, 128, 3)

model.add(BatchNormalization(input_shape=(20, 128, 128, 3)))

model.add(TimeDistributed(Conv2D(32, (3, 3), strides=(1, 1),activation='relu', padding='same')))
model.add(TimeDistributed(MaxPooling2D((2, 2))))
model.add(TimeDistributed(Conv2D(64, (3, 3), strides=(1, 1),activation='relu', padding='same')))
model.add(TimeDistributed(Conv2D(128, (3, 3), strides=(1, 1),activation='relu', padding='same')))
model.add(TimeDistributed(Conv2D(128, (3, 3), strides=(1, 1),activation='relu', padding='same')))
model.add(TimeDistributed(MaxPooling2D((2, 2))))
model.add(TimeDistributed(Conv2D(256, (3, 3), strides=(1, 1),activation='relu', padding='same')))
model.add(TimeDistributed(MaxPooling2D((2, 2))))

model.add(TimeDistributed(Flatten()))

model.add(LSTM(256, activation='relu', return_sequences=False))
model.add((Dense(128,activation='relu')))

model.add(Dense(5, activation='softmax'))

谁能告诉我为什么验证准确率在第一个 epoch 就高于训练准确率?

【问题讨论】:

【参考方案1】:

我的猜测是,因为你只有 5 个类,所以只对所有帧猜测一个,就会得到 20% 的准确率。现在你有大约 32%,所以稍微好一点。

我通常不看初始准确度,因为模型非常糟糕。 (实际上从图中删除前 N 个(在这种情况下可能是 20/30)时期以更好地显示性能)。

在第一个 epoch 之后检查混淆矩阵,你可能只擅长几门课。

【讨论】:

你的回答对我来说似乎很模糊。如果您能弄清楚这背后的原因,那将非常有帮助。

以上是关于为啥在第一个 epoch 验证准确度高于训练准确度?的主要内容,如果未能解决你的问题,请参考以下文章

Keras图像分类验证准确率更高

为啥 Keras 的 train_on_batch 在第二个 epoch 产生零损失和准确率?

训练期间接近 100% 的准确率,但在图像分类器的测试/验证期间 <50%

验证损失在 3 个 epoch 后增加,但验证准确度不断增加

如何解决没有验证准确性的问题?

验证损失不断减少,而训练损失在 3 个 epoch 后开始增加