迁移学习之图像特征向量提取与运用
本篇文章将要讨论的是关于计算机视觉中迁移学习的概念,一种能够利用预先训练好的模型,从它之前训练的数据集之外的数据集进行学习的能力。
举个例子来说:
现有A,B两个不同的数据集,我们的任务是能够识别中A,B中不同类别的图像(分类任务)
常规做法:分别在A数据集上训练模型X,在B数据集上训练模型Y
迁移学习的做法:在A数据集上训练模型X,改造训练好的模型X,再用X去B数据集上训练。
适用情况:
深度神经网络X已经在大型数据集(例如ImageNet)上训练完成。这些训练完成的模型在迁移学习方面表现优异,复用它们的卷积核相对于重新开始训练新的卷积核而言,更加有意义。
分类:
一般来说,应用于深度学习计算机视觉方向的迁移学习有两种类型:
- 将模型X作为特征提取器,再将提取出来的特征作为其他机器学习算法的输入。
- 将模型X的FC(全连接层)去掉,然后用新的FC层将其代替,然后微调其权重。
本文将着重讨论第一种类型。
用训练好的CNN来提取特征
到目前为止,我们一直将卷积神经网络当作端到端的分类器:
- 把图像输入网络
- 将图像通过前向传播穿过整个网络
- 从网络末端获取分类概率
但是,没有人规定我们一定要让图像穿越整个网络,我们可以选择在任意一层停下来,例如Activation或者Pool层,这时从网络中取出该值,然后将其作为特征向量。
如果我们将整个图像数据集中的图像都经过上述操作提取出对应的特征向量,然后利用这些提取出来的特征向量来训练现有的机器学习的模型(例如线性SVM,逻辑回归分类器和随机森林。
注意在整个过程中,我们的卷积神经网络部分是不能完成分类操作的,我们只是单纯的将其用作 特征提取器,而下游的机器学习分类器负责从卷积神经网络提取的特征中学习潜在模式。
认识HDF5
HDF5是一种由HDF5群创建的二进制数据格式,用来在硬盘上存储巨型数据类型的数据集,同时方便对数据集中的数据进行访问和操作。
HDF5中的数据按照层次存储,和文件系统存储数据的方式非常相似。
-
group:数据首先被定义在group中,group就像是一个容器一样的结构,它可以容纳数据集和其他的group。
-
dataset:一旦group被定义,那么数据集就可以被创建在group中。数据集可以被看成是同一种数据类型的多维数据。
HDF5是通过C编写的,但是凭借h5py模块,我们可以使用python语言来操纵底层的C API。
HDF5令人惊奇的是其与数据交互十分轻松,我们可以在HDF5数据集中存储海量的数据,并且用一种类似于操纵Numpy数组的方式操纵它。
当通过h5py来使用HDF5 的时候,你可以把你的数据当作一个巨大的NumPy数组,这个数组太大了而无妨装入内存中,但是通过HDF5我们仍然可对其进行操作。
最好的点在于,HDF5这种格式是标准化的,意味着存储在HDF5的数据集可以被其他开发者用不同的语言进行读取的操作,比如C,MATLAB和JAVA。
向HDF5中写入数据
工欲善其事,必先利其器。
在开始我们正式工作之前,我们先需要先编写一个小工具,用来读写HDF5文件。
目录结构:
----pyimgsearch
| |----__init__.py
| |----callbacks
| |----inputoutput
| | |----__init__.py
| | |----hdf5datasetwriter.py
| |----nn
| |----preprocessing
| |----utils
import h5py
import os
class HDF5DatasetWriter:
def __init__(self, dims, outputPath, dataKey="images",
bufSize=1000):
if os.path.exists(outputPath):
raise ValueError("The supplied 'outputPath' already exists and "
"cannot be overwritten. Manually delete the file before continuing", outputPath)
self.db = h5py.File(outputPath, "w")
self.data = self.db.create_dataset(dataKey, dims, dtype="float")
self.labels = self.db.create_dataset("labels", (dims[0],), dtype="int")
self.bufsize = bufSize
self.buffer = {
"data" : [], "labels" : []}
self.idx = 0
def add(self, rows, labels):
self.buffer["data"].extend(rows)
self.buffer["labels"].extend(labels)
if len(self.buffer["data"])

本文介绍了如何利用迁移学习中的预训练模型VGG16,作为特征提取器来处理图像数据。通过在大型数据集如ImageNet上预训练的模型,对新的数据集进行特征抽取,然后使用简单的线性分类器(如逻辑回归)进行分类,从而提高分类效率和准确性。文章详细讲解了如何使用HDF5存储大量特征数据,并展示了如何用Python实现特征提取和模型训练的过程。
最低0.47元/天 解锁文章
1188

被折叠的 条评论
为什么被折叠?



