问题:
tensorflow:Early stopping conditioned on metric val_loss
which is not available. Available metrics are: loss,accuracy
解决办法
:
增加验证集大小,即可看见训练过程中loss,accuracy,val_loss和val_accuracy。
提醒:
笔者train_generator、test_generator、val_generator都是通过TFRecord把文件夹中分配好的数据集读取并按文件夹分类的categorical labels;
model.compile(loss='categorical_crossentropy',optimizer='adam', metrics=['accuracy'])
使用early_stopping时,笔者设置如下:
early_stopping = EarlyStopping(monitor='val_loss',patience=3)
early_stopping用法:
使用在模型训练过程中,在model.compile过程中设置使用,是防止训练模型过拟合,在模型不能继续优化迭代过程时自动停止模型训练并保留最佳模型。
其中主要参数有:
monitor是监督的指标,可以设置‘loss’, ‘val_loss’, ‘accuracy’, ‘val_accuracy’(我在博客中也看见有人出现了binary_accuracy,我想这个应该是和自己设置的metrics指标有关,同时也提醒大家注意自己metrics是否选择正确,这个也和自己labels类型有关)。
patience是你能容忍监督指标几次不按照优化过程该表。比如:monitor设置val_loss,patience=3,表示如果连续3次val_loss不减小(也就是变大了),就停止迭代。
min_delta是表示变化的幅度,这个需要根据你本身模型的准确度来设置,例如:如果你模型准确度已经有85%,那么可能你也不在乎1%的变化;但是如果我准确率仅有60%的情况下,增加1%也是不错的。
mode: 就’auto’, ‘min’, ‘,max’,我没有选择这个。
min_delta和patience都和“避免模型停止在抖动过程中”有关系,所以调节的时候需要互相协调。通常情况下,min_delta降低,那么patience可以适当减少;min_delta增加,那么patience需要适当延长;反之亦然。
我最开始跟着别的博主把monitor设置成loss,傻傻的训练了无数次的模型,都是训练完后再用测试集评价才知道模型还是过拟合了,还不知道为什么,反复问自己明明我用了early_stopping为什么还会过拟合。等我换成‘val_loss’,并把上面出现的val数据集过小的问题解决了以后,就能在每一次迭代过程中看见loss,accuracy,val_loss和val_accuracy四个指标值。不用傻傻等到最后还是错误的结果啦~~
修改前跑出来的样子(这就是验证集比例设置小了导致训练过程中只能看到loss和accuracy.):
修改后跑出来的样子(这样才能在训练过程中发现模型是否过拟合,要不要继续跑,early_stopping是否起作用了):