Keras猫狗大战七:resnet50预训练模型迁移学习优化,动态调整学习率,精度提高到96.2%

https://www.cnblogs.com/zhengbiqing/p/11780161.html中直接在resnet网络的卷积层后添加一层分类层,得到一个最简单的迁移学习模型,得到的结果为95.3%。

这里对最后的分类网络做些优化:用GlobalAveragePooling2D替换Flatten、增加一个密集连接层(同时添加BN、Activation、Dropout):

conv_base = ResNet50(weights=‘imagenet‘, include_top=False, input_shape=(150, 150, 3))
for layers in conv_base.layers[:]:
    layers.trainable = False

x = conv_base.output
x = GlobalAveragePooling2D()(x)
x = Dense(1024)(x)
x = BatchNormalization()(x)
x = Activation(‘relu‘)(x)
x = Dropout(0.3)(x)
predictions = Dense(1, activation=‘sigmoid‘)(x)
model = Model(inputs=conv_base.input, outputs=predictions)

另外采用动态学习率,并且打印显示出学习率:

optimizer = optimizers.RMSprop(lr=1e-3)

def get_lr_metric(optimizer):
    def lr(y_true, y_pred):
        return optimizer.lr

    return lr

lr_metric = get_lr_metric(optimizer)

model.compile(loss=‘binary_crossentropy‘, optimizer=optimizer, metrics=[‘acc‘,lr_metric])

当模型的val_loss训练多轮不再下降时,提前结束训练:

from keras.callbacks import ReduceLROnPlateau,EarlyStopping

early_stop = EarlyStopping(monitor=‘val_loss‘, patience=13)
reduce_lr = ReduceLROnPlateau(monitor=‘val_loss‘, patience=7, mode=‘auto‘, factor=0.2)
callbacks = [early_stop,reduce_lr]

history = model.fit_generator(
      train_generator,
      steps_per_epoch=train_generator.samples//batch_size,
      epochs=100,
      validation_data=validation_generator,
      validation_steps=validation_generator.samples//batch_size,
      callbacks = callbacks)

共训练了61epochs,学习率从0.001下降到1.6e-6:

Epoch 1/100
281/281 [==============================] - 141s 503ms/step - loss: 0.3322 - acc: 0.8589 - lr: 0.0010 - val_loss: 0.2344 - val_acc: 0.9277 - val_lr: 0.0010
Epoch 2/100
281/281 [==============================] - 79s 279ms/step - loss: 0.2591 - acc: 0.8862 - lr: 0.0010 - val_loss: 0.2331 - val_acc: 0.9288 - val_lr: 0.0010
Epoch 3/100
281/281 [==============================] - 78s 279ms/step - loss: 0.2405 - acc: 0.8959 - lr: 0.0010 - val_loss: 0.2292 - val_acc: 0.9303 - val_lr: 0.0010......
281/281 [==============================] - 77s 275ms/step - loss: 0.1532 - acc: 0.9407 - lr: 1.6000e-06 - val_loss: 0.1871 - val_acc: 0.9412 - val_lr: 1.6000e-06
Epoch 60/100
281/281 [==============================] - 78s 276ms/step - loss: 0.1492 - acc: 0.9396 - lr: 1.6000e-06 - val_loss: 0.1687 - val_acc: 0.9450 - val_lr: 1.6000e-06
Epoch 61/100
281/281 [==============================] - 77s 276ms/step - loss: 0.1468 - acc: 0.9414 - lr: 1.6000e-06 - val_loss: 0.1825 - val_acc: 0.9454 - val_lr: 1.6000e-06

加载模型:
optimizer = optimizers.RMSprop(lr=1e-3)

def get_lr_metric(optimizer):
    def lr(y_true, y_pred):
        return optimizer.lr

    return lr

lr_metric = get_lr_metric(optimizer)
model = load_model(model_file, custom_objects={‘lr‘:lr_metric})

修改混淆矩阵函数,以打印每个类别的精确度:

def plot_sonfusion_matrix(cm, classes, normalize=False, title=‘Confusion matrix‘, cmap=plt.cm.Blues):
    plt.imshow(cm, interpolation=‘nearest‘, cmap=cmap)
    plt.title(title)
    plt.colorbar()
    tick_marks = np.arange(len(classes))
    plt.xticks(tick_marks, classes, rotation=45)
    plt.yticks([-0.5,1.5], classes)

    print(cm)
    ok_num = 0
    for k in range(cm.shape[0]):
        print(cm[k,k]/np.sum(cm[k,:]))
        ok_num += cm[k,k]

    print(ok_num/np.sum(cm))

    if normalize:
        cm = cm.astype(‘float‘) / cm.sum(axis=1)[:, np.newaxis]

    thresh = cm.max() / 2.0
    for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])):
        plt.text(j, i, cm[i, j], horizontalalignment=‘center‘, color=‘white‘ if cm[i, j] > thresh else ‘black‘)

    plt.tight_layout()
    plt.ylabel(‘True label‘)
    plt.xlabel(‘Predict label‘)

测试结果为:

[[1200   50]
 [  45 1205]]
0.96
0.964
0.962猫的准确度为96%,狗的为96.4%,总的准确度为96.2%。混淆矩阵图:

原文地址:https://www.cnblogs.com/zhengbiqing/p/11964301.html

时间: 2024-07-30 14:12:26

Keras猫狗大战七:resnet50预训练模型迁移学习优化,动态调整学习率,精度提高到96.2%的相关文章

Keras猫狗大战八:resnet50预训练模型迁移学习,图片先做归一化预处理,精度提高到97.5%

在上一篇的基础上,对数据调用keras图片预处理函数preprocess_input做归一化预处理,进行训练. 导入preprocess_input: import os from keras import layers, optimizers, models from keras.applications.resnet50 import ResNet50, preprocess_input from keras.layers import * from keras.models import

pytorch实战 猫狗大战Kaggle 迁移学习ResNet50模型微调

pytorch实战 猫狗大战Kaggle 迁移学习ResNet50模型微调 猫狗大战数据集 这是kaggle上一个非常经典的二分类图像数据集,训练集包括25000张猫和狗的图片及其标签,测试集则是12500张未标签图片,数据下载地址https://www.kaggle.com/c/dogs-vs-cats/data.不过这个网址比较远古,无法提交自己训练的答案,可以到新的(虽然也不新了)比赛链接提交https://www.kaggle.com/c/dogs-vs-cats-redux-kerne

迁移学习调用预训练模型出现Given input size: (512x3x3). Calculated output size: (512x-3x-3)错误

调用预训练模型ResNet18时报错:RuntimeError: Given input size: (512x3x3). Calculated output size: (512x-3x-3). Output size is too small at /opt/conda/conda-bld/pytorch_1535491974311/work/aten/src/THCUNN/generic/SpatialAveragePooling.cu:63 其解决方法是将倒数第二层的self.avgpo

1、VGG16 2、VGG19 3、ResNet50 4、Inception V3 5、Xception介绍——迁移学习

ResNet, AlexNet, VGG, Inception: 理解各种各样的CNN架构 本文翻译自ResNet, AlexNet, VGG, Inception: Understanding various architectures of Convolutional Networks,原作者保留版权 卷积神经网络在视觉识别任务上的表现令人称奇.好的CNN网络是带有上百万参数和许多隐含层的"庞然怪物".事实上,一个不好的经验规则是:网络越深,效果越好.AlexNet,VGG,Inc

预训练模型与Keras.applications.models权重资源地址

什么是预训练模型 简单来说,预训练模型(pre-trained model)是前人为了解决类似问题所创造出来的模型.你在解决问题的时候,不用从零开始训练一个新模型,可以从在类似问题中训练过的模型入手. 比如说,你如果想做一辆自动驾驶汽车,可以花数年时间从零开始构建一个性能优良的图像识别算法,也可以从Google在ImageNet数据集上训练得到的Inception model(一个预训练模型)起步,来识别图像. 一个预训练模型可能对于你的应用中并不是100%的准确对口,但是它可以为你节省大量功夫

keras中使用预训练模型进行图片分类

keras中含有多个网络的预训练模型,可以很方便的拿来进行使用. 安装及使用主要参考官方教程:https://keras.io/zh/applications/   https://keras-cn.readthedocs.io/en/latest/other/application/ 官网上给出了使用 ResNet50 进行 ImageNet 分类的样例 from keras.applications.resnet50 import ResNet50 from keras.preprocess

【火炉炼AI】深度学习006-移花接木-用Keras迁移学习提升性能

[火炉炼AI]深度学习006-移花接木-用Keras迁移学习提升性能 (本文所使用的Python库和版本号: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2, Keras 2.1.6, Tensorflow 1.9.0) 上一篇文章我们用自己定义的模型来解决了二分类问题,在20个回合的训练之后得到了大约74%的准确率,一方面是我们的epoch太小的原因,另外一方面也是由于模型太简单,结构简单,故而不能做太复杂的事情,那么怎么提升

TensorFlow keras 迁移学习

数据的读取 import tensorflow as tf from tensorflow.python import keras from tensorflow.python.keras.preprocessing.image import ImageDataGenerator class TransferModel(object): def __init__(self): #标准化和数据增强 self.train_generator = ImageDataGenerator(rescale=

keras调用预训练模型分类

在网上看到一篇博客,地址https://www.pyimagesearch.com/2017/03/20/imagenet-vggnet-resnet-inception-xception-keras/,是关于利用keras上预训练的模型进行图像分类的示例,于是我也自己动手运行了一下,效果,一般. 上代码 from keras.applications import ResNet50 from keras.applications import InceptionV3 from keras.ap