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=1.0/255.0)
        self.test_generator = ImageDataGenerator(rescale=1.0/255.0)
        #指定训练集数据和测试集数据目录
        self.train_dir = "./data/train"
        self.test_dir = "./data/test"
        self.image_size = (224,224)
        self.batch_size = 32

    def get_loacl_data(self):
        ‘‘‘
        读取本地的图片数据以及类别
        :return:
        ‘‘‘
        train_gen = self.train_generator.flow_from_directory(self.train_dir,
                                                 target_size=self.image_size,
                                                 batch_size=self.batch_size,
                                                 class_mode=‘binary‘,
                                                 shuffle=True)
        test_gen = self.test_generator.flow_from_directory(self.test_dir,
                                                           target_size=self.image_size,
                                                           batch_size=self.batch_size,
                                                           class_mode=‘binary‘,
                                                           shuffle=True)

        return train_gen,test_gen

if __name__ == ‘__main__‘:
    tm = TransferModel()
    train_gen,test_gen = tm.get_loacl_data()
    print(train_gen)

  迁移学习完整代码

import tensorflow as tf
from tensorflow.python import keras
from tensorflow.python.keras.preprocessing.image import ImageDataGenerator, load_img, img_to_array
from tensorflow.python.keras.applications.vgg16 import VGG16, preprocess_input
import numpy as np

class TransferModel(object):

    def __init__(self):

        # 定义训练和测试图片的变化方法,标准化以及数据增强
        self.train_generator = ImageDataGenerator(rescale=1.0 / 255.0)
        self.test_generator = ImageDataGenerator(rescale=1.0 / 255.0)

        # 指定训练数据和测试数据的目录
        self.train_dir = "./data/train"
        self.test_dir = "./data/test"

        # 定义图片训练相关网络参数
        self.image_size = (224, 224)
        self.batch_size = 32

        # 定义迁移学习的基类模型
        # 不包含VGG当中3个全连接层的模型加载并且加载了参数
        # vgg16_weights_tf_dim_ordering_tf_kernels_notop.h5
        self.base_model = VGG16(weights=‘imagenet‘, include_top=False)

        self.label_dict = {
            ‘0‘: ‘汽车‘,
            ‘1‘: ‘恐龙‘,
            ‘2‘: ‘大象‘,
            ‘3‘: ‘花‘,
            ‘4‘: ‘马‘
        }

    def get_local_data(self):
        """
        读取本地的图片数据以及类别
        :return: 训练数据和测试数据迭代器
        """
        # 使用flow_from_derectory
        train_gen = self.train_generator.flow_from_directory(self.train_dir,
                                                             target_size=self.image_size,
                                                             batch_size=self.batch_size,
                                                             class_mode=‘binary‘,
                                                             shuffle=True)
        test_gen = self.test_generator.flow_from_directory(self.test_dir,
                                                           target_size=self.image_size,
                                                           batch_size=self.batch_size,
                                                           class_mode=‘binary‘,
                                                           shuffle=True)
        return train_gen, test_gen

    def refine_base_model(self):
        """
        微调VGG结构,5blocks后面+全局平均池化(减少迁移学习的参数数量)+两个全连接层
        :return:
        """
        # 1、获取原notop模型得出
        # [?, ?, ?, 512]
        x = self.base_model.outputs[0]

        # 2、在输出后面增加我们结构
        # [?, ?, ?, 512]---->[?, 1 * 1 * 512]
        x = keras.layers.GlobalAveragePooling2D()(x)

        # 3、定义新的迁移模型
        x = keras.layers.Dense(1024, activation=tf.nn.relu)(x)
        y_predict = keras.layers.Dense(5, activation=tf.nn.softmax)(x)

        # model定义新模型
        # VGG 模型的输入, 输出:y_predict
        transfer_model = keras.models.Model(inputs=self.base_model.inputs, outputs=y_predict)

        return transfer_model

    def freeze_model(self):
        """
        冻结VGG模型(5blocks)
        冻结VGG的多少,根据你的数据量
        :return:
        """
        # self.base_model.layers 获取所有层,返回层的列表
        for layer in self.base_model.layers:
            layer.trainable = False

    def compile(self, model):
        """
        编译模型
        :return:
        """
        model.compile(optimizer=keras.optimizers.Adam(),
                      loss=keras.losses.sparse_categorical_crossentropy,
                      metrics=[‘accuracy‘])
        return None

    def fit_generator(self, model, train_gen, test_gen):
        """
        训练模型,model.fit_generator()不是选择model.fit()
        :return:
        """
        # 每一次迭代准确率记录的h5文件
        modelckpt = keras.callbacks.ModelCheckpoint(‘./ckpt/transfer_{epoch:02d}-{val_acc:.2f}.h5‘,
                                                     monitor=‘val_acc‘,
                                                     save_weights_only=True,
                                                     save_best_only=True,
                                                     mode=‘auto‘,
                                                     period=1)

        model.fit_generator(train_gen, epochs=3, validation_data=test_gen, callbacks=[modelckpt])

        return None

    def predict(self, model):
        """
        预测类别
        :return:
        """

        # 加载模型,transfer_model
        model.load_weights("./ckpt/transfer_02-0.93.h5")

        # 读取图片,处理
        image = load_img("./1.jpg", target_size=(224, 224))
        image.show()
        image = img_to_array(image)
        # print(image.shape)
        # 四维(224, 224, 3)---》(1, 224, 224, 3)
        img = image.reshape([1, image.shape[0], image.shape[1], image.shape[2]])
        # print(img)
        # model.predict()

        # 预测结果进行处理
        image = preprocess_input(img)
        predictions = model.predict(image)
        print(predictions)
        res = np.argmax(predictions, axis=1)
        print("所预测的类别是:",self.label_dict[str(res[0])])

if __name__ == ‘__main__‘:
    tm = TransferModel()
    # 训练
    # train_gen, test_gen = tm.get_local_data()
    # # print(train_gen)
    # # for data in train_gen:
    # #     print(data[0].shape, data[1].shape)
    # # print(tm.base_model.summary())
    # model = tm.refine_base_model()
    # # print(model)
    # tm.freeze_model()
    # tm.compile(model)
    #
    # tm.fit_generator(model, train_gen, test_gen)

    # 测试
    model = tm.refine_base_model()

    tm.predict(model)

  

原文地址:https://www.cnblogs.com/LiuXinyu12378/p/12267402.html

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

TensorFlow keras 迁移学习的相关文章

【火炉炼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』迁移学习_他山之石,可以攻玉

目的: 使用google已经训练好的模型,将最后的全连接层修改为我们自己的全连接层,将原有的1000分类分类器修改为我们自己的5分类分类器,利用原有模型的特征提取能力实现我们自己数据对应模型的快速训练.实际中对于一个陌生的数据集,原有模型经过不高的迭代次数即可获得很好的准确率. 实战: 实机文件夹如下,两个压缩文件可以忽略: 花朵图片数据下载: 1 curl -O http://download.tensorflow.org/example_images/flower_photos.tgz 已经

tensorflow实现迁移学习

此例程出自<TensorFlow实战Google深度学习框架>6.5.2小节 卷积神经网络迁移学习. 数据集来自http://download.tensorflow.org/example_images/flower_photos.tgz ,及谷歌提供的Inception-v3模型https://storage.googleapis.com/download.tensorflow.org/models/inception_dec_2015.zip . 自行下载和解压. 解压后的文件夹包含5个子

吴裕雄--天生自然python Google深度学习框架:Tensorflow实现迁移学习

import glob import os.path import numpy as np import tensorflow as tf from tensorflow.python.platform import gfile import tensorflow.contrib.slim as slim # 加载通过TensorFlow-Slim定义好的inception_v3模型. import tensorflow.contrib.slim.python.slim.nets.incepti

Tensorflow+Keras 深度学习人工智能实践应用 Chapter Two 深度学习原理

2.1神经传导原理 y=activation(x*w+b) 激活函数通常为非线性函数  Sigmoid 函数 和  ReLU函数 2.2以矩阵运算模仿真神经网络 y=activation(x*w+b) 输出=激活函数(输入*权重+偏差) 2.3多层感知器模型 1以多层感知器模型识别minst 手写数字图像 输入层的数据 是28*28的二维图像 以reshape 转换为1 维的向量 作为784个神经元的shuru 输入层 784 个输入神经元接收外界信号 隐藏层 模拟内部神经元 共有 256个隐藏

【火炉炼AI】深度学习009-用Keras迁移学习提升性能(多分类问题)

[火炉炼AI]深度学习009-用Keras迁移学习提升性能(多分类问题) (本文所使用的Python库和版本号: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2, Keras 2.1.6, Tensorflow 1.9.0) 本文是仿照前面的文章[火炉炼AI]深度学习006-移花接木-用Keras迁移学习提升性能,原文是针对二分类问题,使用迁移学习的方式来提升准确率,此处我用迁移学习的方式来提升多分类问题的准确率. 同时,在我前

TensorFlow从1到2(九)迁移学习

迁移学习基本概念 迁移学习是这两年比较火的一个话题,主要原因是在当前的机器学习中,样本数据的获取是成本最高的一块.而迁移学习可以有效的把原有的学习经验(对于模型就是模型本身及其训练好的权重值)带入到新的领域,从而不需要过多的样本数据,也能达到大批量数据所达成的效果,进一步节省了学习的计算量和时间. MobileNet V2是由谷歌在2018年初发布的一个视觉模型,在Keras中已经内置的并使用ImageNet完成了训练,可以直接拿来就用,这个我们在本系列第五篇中已经提过了.MobileNet V

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,

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