inceptionv3迁移学习 训练+测试

迁移学习在实际应用中的意义非常大,它可以将之前已学过的知识(模型参数)迁移到一项新的任务上,使学习效率大大的提高。我们知道,要训练一个复杂的深度学习模型,成本是十分巨大的。而迁移学习可以大大的降低我们的训练成本,在短时间内就能达到很好的效果。

 

迁移学习的四种应用场景:

场景一:数据集小,数据相似度高(与pre-trained model的训练数据相比而言)

        在这种情况下,因为数据与预训练模型的训练数据相似度很高,因此我们不需要重新训练模型。我们只需要将输出层改制成符合问题情境下的结构就好。我们使用公开大模型作为我们的特征提取器。比如说我们使用在ImageNet上训练的模型来辨认一组新照片中的小猫小狗。在这里,需要被辨认的图片与ImageNet库中的图片类似,但是我们的输出结果中只需要两项——猫或者狗。在这个例子中,我们需要做的就是把最终softmax layer的输出从1000个类别改为2个类别。当然为了达到更好的效果,我们可能会在最后加几层全链接,这个根据实际情况而定。

场景二:数据集小,数据相似度不高

       在这种情况下,我们可以冻结预训练模型中的前k个层中的权重,然后重新训练后面的n-k个层,当然最后一层也需要根据相应的输出格式来进行修改。因为数据的相似度不高,重新训练的过程就变得非常关键。而新数据集大小的不足,则是通过冻结预训练模型的前k层进行弥补。

场景三:数据集大,数据相似度不高

       在这种情况下,因为我们有一个很大的数据集,所以神经网络的训练过程将会比较有效率。然而,因为实际数据与预训练模型的训练数据之间存在很大差异,采用预训练模型将不会是一种高效的方式。因此最好的方法还是将预处理模型中的权重全都初始化后在新数据集的基础上重头开始训练。

场景四:数据集大,数据相似度高

       这就是最理想的情况,采用预训练模型会变得非常高效。最好的运用方式是保持模型原有的结构和初始权重不变,随后在新数据集的基础上重新训练。

 

下面是通过对inceptionv3网络进行迁移学习来识别5种花的例子:

1.下载谷歌已训练好的inceptionv3网络   https://storage.googleapis.com/download.tensorflow.org/models/inception_dec_2015.zip

2.数据集下载   http://download.tensorflow.org/example_images/flower_photos.tgz

3.替换最后一个softmax层,在最后这一层全连接层之前的网络层称之为瓶颈层bottleneck。将新的图像通过训练好的卷积神经网络直到瓶颈层的过程,可以看成是对图像进行特征提取的过程。在训练好的inceptionV3模型中,因为将瓶颈层的输出再通过一个单层的全连接层神经网络可以很好地区分1000种类别的图像,所以有理由认为瓶颈层输出的节点向量可以被作为任何图像的一个更加精简且表达能力更强的特征向量。

4.训练自己的数据,并保存pb模型文件

5.恢复模型进行预测

 

训练并保存模型代码:

# -*- coding: utf-8 -*-
"""
卷积神经网络 Inception-v3模型 迁移学习
并保存pb模型文件
"""
import glob
import os.path
import random
import numpy as np
import tensorflow as tf
from tensorflow.python.platform import gfile
from tensorflow.python.framework import graph_util

# inception-v3 模型瓶颈层的节点个数
BOTTLENECK_TENSOR_SIZE = 2048
BOTTLENECK_TENSOR_NAME = 'pool_3/_reshape:0'
# 图像输入张量所对应的名称
JPEG_DATA_TENSOR_NAME = 'DecodeJpeg/contents:0'

# 下载的谷歌训练好的inception-v3模型文件目录
MODEL_DIR = 'model'
# 下载的谷歌训练好的inception-v3模型文件名
MODEL_FILE = 'tensorflow_inception_graph.pb'

# 保存训练数据通过瓶颈层后提取的特征向量
CACHE_DIR = 'tmp/bottleneck'

# 图片数据的文件夹
INPUT_DATA = 'flower_data/'

# 验证的数据百分比
VALIDATION_PERCENTAGE = 10
# 测试的数据百分比
TEST_PERCENTACE = 10

# 定义神经网路的设置
LEARNING_RATE = 0.1
STEPS = 5000
BATCH = 100


# 这个函数把数据集分成训练,验证,测试三部分
def create_image_lists(testing_percentage, validation_percentage):
    """
    这个函数把数据集分成训练,验证,测试三部分
    :param testing_percentage:测试的数据百分比 10
    :param validation_percentage:验证的数据百分比 10
    :return:
    """
    result = {}
    # 获取目录下所有子目录
    sub_dirs = [x[0] for x in os.walk(INPUT_DATA)]
    # ['/path/to/flower_data', '/path/to/flower_data\\daisy', '/path/to/flower_data\\dandelion',
    # '/path/to/flower_data\\roses', '/path/to/flower_data\\sunflowers', '/path/to/flower_data\\tulips']

    # 数组中的第一个目录是当前目录,这里设置标记,不予处理
    is_root_dir = True

    for sub_dir in sub_dirs:
评论 30
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值