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 Model

数据生成添加preprocessing_function=preprocess_input

from keras.preprocessing.image import ImageDataGenerator

batch_size = 64

train_datagen = ImageDataGenerator(
    rotation_range=40,
    width_shift_range=0.2,
    height_shift_range=0.2,
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip=True,
    vertical_flip=True,
    preprocessing_function=preprocess_input)

test_datagen = ImageDataGenerator(preprocessing_function=preprocess_input)

train_generator = train_datagen.flow_from_directory(
        # This is the target directory
        train_dir,
        # All images will be resized to 150x150
        target_size=(150, 150),
        batch_size=batch_size,
        # Since we use binary_crossentropy loss, we need binary labels
        class_mode=‘binary‘)

validation_generator = test_datagen.flow_from_directory(
        validation_dir,
        target_size=(150, 150),
        batch_size=batch_size,
        class_mode=‘binary‘)

训练25epoch,学习率从1e-3下降到4e-5:

Epoch 1/100
281/281 [==============================] - 152s 540ms/step - loss: 0.2849 - acc: 0.8846 - lr: 0.0010 - val_loss: 0.1195 - val_acc: 0.9694 - val_lr: 0.0010
Epoch 2/100
281/281 [==============================] - 79s 282ms/step - loss: 0.2234 - acc: 0.9079 - lr: 0.0010 - val_loss: 0.1105 - val_acc: 0.9673 - val_lr: 0.0010
Epoch 3/100
281/281 [==============================] - 80s 285ms/step - loss: 0.2070 - acc: 0.9135 - lr: 0.0010 - val_loss: 0.1061 - val_acc: 0.9716 - val_lr: 0.0010
Epoch 4/100
281/281 [==============================] - 80s 283ms/step - loss: 0.1939 - acc: 0.9203 - lr: 0.0010 - val_loss: 0.0998 - val_acc: 0.9748 - val_lr: 0.0010
Epoch 5/100......
Epoch 22/100
281/281 [==============================] - 80s 284ms/step - loss: 0.1368 - acc: 0.9470 - lr: 4.0000e-05 - val_loss: 0.0943 - val_acc: 0.9777 - val_lr: 4.0000e-05
Epoch 23/100
281/281 [==============================] - 80s 283ms/step - loss: 0.1346 - acc: 0.9479 - lr: 4.0000e-05 - val_loss: 0.1046 - val_acc: 0.9720 - val_lr: 4.0000e-05
Epoch 24/100
281/281 [==============================] - 79s 283ms/step - loss: 0.1320 - acc: 0.9476 - lr: 4.0000e-05 - val_loss: 0.0938 - val_acc: 0.9759 - val_lr: 4.0000e-05
Epoch 25/100
281/281 [==============================] - 79s 282ms/step - loss: 0.1356 - acc: 0.9476 - lr: 4.0000e-05 - val_loss: 0.1063 - val_acc: 0.9745 - val_lr: 4.0000e-05

在测试图片时也需要进行归一化预处理:
def get_input_xy(src=[]):
    pre_x = []
    true_y = []

    class_indices = {‘cat‘: 0, ‘dog‘: 1}

    for s in src:
        input = cv2.imread(s)
        input = cv2.resize(input, (150, 150))
        input = cv2.cvtColor(input, cv2.COLOR_BGR2RGB)
        pre_x.append(preprocess_input(input))

        _, fn = os.path.split(s)
        y = class_indices.get(fn[:3])
        true_y.append(y)

    pre_x = np.array(pre_x)

    return pre_x, true_y

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))
    print(tick_marks, type(tick_marks))
    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‘)

测试结果为97.5%,较前面提高了1.3%:

[[1225   25]
 [  38 1212]]
0.98
0.9696
0.9748

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

时间: 2024-08-30 10:34:11

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

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,

Caffe学习3-使用预训练模型finetuning

该篇陈述了在采用imagenet大数据集合上使用caffenet预训练得到caffemodel,然后应用该caffemodel进一步fintuning图像风格数据库style.下面为主要步骤: #采用别人的预训练模型,在自己的数据库上进行微调(fine-tunning) #fine-tune是应用别人在大数据集合上训练到一定程度的caffemodel,在这进行微调.这比随机化参数要好,因为该模型可能已经接近最优! #可以省时间,省资源.也可以克服没有大数据的困扰 #这里采用imagenet数据集

图像分类任务不用冷启动,PaddlePaddle一口气发布十大预训练模型

PaddlePaddle在不断增加官方支持的模型的同时,也在关注预训练模型的丰富度. 在过去的版本中,我们已经发布了目标检测Faster-RCNN.MobileNet-SSD.PyramidBox和场景文字识别CRNN-CTC.OCR Attention共计5个预训练模型. 近期,在图像分类领域我们一口气发布了四个系列共十个预训练模型,丰富扩充了预训练模型库,助力用户提高构建模型的效率,大大减轻"炼丹"的烦恼. 主要包括: MobileNet v1 针对亟需在移动端应用深度学习技术的需

BERT 预训练模型及文本分类

BERT 预训练模型及文本分类 介绍 如果你关注自然语言处理技术的发展,那你一定听说过 BERT,它的诞生对自然语言处理领域具有着里程碑式的意义.本次试验将介绍 BERT 的模型结构,以及将其应用于文本分类实践. 知识点 语言模型和词向量 BERT 结构详解 BERT 文本分类 BERT 全称为 Bidirectional Encoder Representations from Transformer,是谷歌在 2018 年 10 月发布的语言表示模型.BERT 通过维基百科和书籍语料组成的庞

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