keras CNN:训练集和验证集相同,但准确度不同

Arc*_*yno 6 deep-learning keras tensorflow

我知道这是一件非常糟糕的事情,但我注意到使用 keras mobilenet 有一些奇怪的事情:

我使用相同的数据进行训练和验证集:

train_generator = train_datagen.flow_from_directory(
    train_dir,
    target_size=(IM_WIDTH, IM_HEIGHT),
    batch_size=batch_size,
    class_mode = "categorical"
)
validation_generator = train_datagen.flow_from_directory(
  train_dir,
  target_size=(IM_WIDTH, IM_HEIGHT),
  class_mode = "categorical"
)
Run Code Online (Sandbox Code Playgroud)

但我没有得到相同的准确度!

epoch 30/30 - loss: 0.3485 - acc: 0.8938 - val_loss: 1.7545 - val_acc: 0.4406

与验证集相比,我似乎过度拟合了训练集......但它们应该是相同的!这怎么可能?

den*_*s-w 1

训练损失是动态计算的,只有验证损失是在训练纪元后计算的。因此,一开始几乎未经训练的网络会使训练损失比实际情况更糟。这种影响应该会在以后的 epoch 中消失,因为那时一个 epoch 对得分的影响就不再那么大了。

keras faq中解决了此行为。如果您在纪元结束时使用自己编写的回调对两者进行评估,则它们应该是相同的。