1. 数据的探索
ImageNet数据集中包含有猫狗的具体分类,对一个图片在载有ImageNet上预训练权值的xception模型上进行预测,如果其预测结果top50不包含猫狗真实的标签分类(图片预测值前50都没有正常分类),那么就将其视为异常值在输入模型之前,我们需要对数据集进行预处理:剔除掉训练集中的异常值。
参考:https://blog.youkuaiyun.com/tustzhoujian/article/details/81335032
2.keras利用TensorBoard画loss和acc曲线
这个网上很多,但很零碎,挺难运行的起来的。现提供一种可以运行的代码供参考:
from keras.callbacks import TensorBoard, EarlyStopping
tbCallBack = TensorBoard(log_dir='./Graph',
histogram_freq=0,
write_graph=True,
write_images=True)
early_stopping = EarlyStopping(monitor='val_loss', mode ='min',patience=2)
model_history = model.fit_generator(train_generator, epochs=30, validation_data=evaluate_generator,
callbacks=[early_stopping,tbCallBack])
这段代码核心部分是导包分清楚是在tensorflow下的keras还是直接在keras下,不然会出现tensorflow.python.framework.errors_impl.FailedPreconditionError: Error while reading resource错误,原因是应用的TensorBoard与keras不在同一层。early_stopping 控制当模型达到指定的条件时停止训练保存现有模型。
3. acc、val_acc、loss、val_loss详解
acc为训练集上的准确率,val_acc为验证集上的准确率。
loss为训练集上的损失,val_loss是验证集上的损失。
(1)acc、val_acc停留在一个值附近,上下震荡
原因:陷入了局部最优
解决方案:lr太小,不足以跳出这个小坑,增大lr值。例如原始的预编译模型部分为:
model.compile(optimizer=SGD(lr=0.0001, momentum=0.9), loss='categorical_crossentropy', metrics=['accuracy'])
这时候你需要把lr调大一点,可以是2倍或者10倍,视情况而定。此时还需要接着观察acc以及val_acc的变化。
(2)loss下降acc上升,val_acc下降val_loss上升
描述: 20分类的迁移学习训练过程中,训练集上的acc正常上升,第一轮训练稳定在0.4,val_acc第一轮只有0.06上下,以后acc不断增大,val_acc出现下降趋势。