InceptionV3模型介绍+参数设置+迁移学习方法

InceptionV3模型介绍+参数设置+迁移学习方法_第1张图片

选择卷积神经网络也面临着难题,首先任何一种卷积神经网络都需要大量的样本输入,而大量样本输入则对应着非常高的计算资源需求,而结合本文的数据集才有80个样本这样的事实,选择一种少量数据集下表现优秀的卷积神经网络就成了关键点。
目前业界针对小数据集进行卷积神经网络训练提出的主流方式是迁移学习(transfer learning)。该方法的思想是使用大数据集进行模型训练,然后使用训练好的参数对小样本进行参数微调,这样使得最终训练出来的模型具有小数据集和高精度的双重优势,由此可见本文数据集上理想的解决方案即是:迁移学习+参数微调。
迁移学习目前网络上提供的模型较多,综合考虑模型参数量、模型表现、模型可得性、模型训练计算资源需求量、模型易用性等因素,本文选择了Google开源的Inception-v3模型作为迁移学习的框架,该框架在ImageNet数据集上进行训练,该数据集有着1000个类别超过100万张的图片数据,该模型在ImageNet数据集上获得了优秀的表现。
模型构建
选择了Inception-v3模型后,本文的做法是将该模型瓶颈层的输出作为提取的特征,然后把这些特征经过一个全连接层进行分类,Inception-v3模型示意图如下:InceptionV3模型介绍+参数设置+迁移学习方法_第2张图片

在上图中最右边示意的Bottleneck feature 位置即是特征输出的位置,也就是说该模型的最后三层被丢弃,然后瓶颈层的结果作为本文新模型的特征提取结果,该结果是2048长度的特征向量。
获得该特征向量之后,需要将其输入一个全连接层进行分类,全连接层的模型示意图如下:
InceptionV3模型介绍+参数设置+迁移学习方法_第3张图片

感觉用起来和VGG16并没有太大区别

参数设置

**验证集测试集百分比:**验证集用于在训练过程中实时测试模型的训练效果,而测试集则用于在最后测试模型的正确率。本文中每个类别的图像数量在300到500数量级,考虑到验证集和测试集需要能测试模型的效果,因而数据量不可太少,同时为了有效利用数据进行训练,则也不能划分太多数据出去,故而综合衡量之后选择以数据的10%作为验证集和测试集。

**训练次数(epoch):**训练次数即对模型进行多少次的训练,训练次数太少分类效果差,但是训练次数太多则会导致浪费时间,在本文中,先使用一个较小的数据量进行试训练,经过观察发现10000次的训练次数基本能让模型达到训练稳定,故而综合考虑后选择10000次作为训练次数。

学习率:学习率是在训练过程中对权重进行调整的一个比例因子,太大的学习率会导致模型波动不能收敛,甚至无法收敛,而太小的学习率则让模型收敛过慢,浪费训练时间和计算资源,在本文中,先使用一个较大的学习率(0.1)进行测试,然后不断减小,最终选用了一种指数下降的学习率,其衰减公式为:
上式中,LR(Learning Rate)代表学习率;BLR(Base Learning Rate)代表基础学习率,本文取0.1;MLR(Minimum Learning Rate)代表最小学习率,即学习率衰减的最低限度,本文取0.001;STEPS即是训练的次数,本文统一取为10000次,i是当前训练次数,从0开始到9999。

Batch_Size(批尺寸):在深度学习中,一般采用SGD训练,即每次训练在训练集中取batchsize个样本训练;小数据集一般一开始就全部放进去了

InceptionV3模型介绍+参数设置+迁移学习方法_第4张图片

两种迁移学习的方式

或者这样(官方)

for layer in model.layers[:249]:
   layer.trainable = False
for layer in model.layers[249:]:
   layer.trainable = True

抽取中间某层特征

from keras.applications.vgg19 import VGG19
from keras.preprocessing import image
from keras.applications.vgg19 import preprocess_input
from keras.models import Model
import numpy as np

base_model = VGG19(weights='imagenet')
model = Model(inputs=base_model.input, outputs=base_model.get_layer('block4_pool').output)

img_path = 'elephant.jpg'
img = image.load_img(img_path, target_size=(224, 224))
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
x = preprocess_input(x)

block4_pool_features = model.predict(x)#把该图像输入model

你可能感兴趣的:(InceptionV3模型介绍+参数设置+迁移学习方法)