如何存储 CNN 提取的特征来训练 SVM 分类器

Posted

技术标签:

【中文标题】如何存储 CNN 提取的特征来训练 SVM 分类器【英文标题】:How to store CNN extracted features to train a SVM classifier 【发布时间】:2018-10-25 19:26:28 【问题描述】:

使用如下所示的 2D CNN 从图像中提取特征,我如何存储提取的特征以训练 SVM 对特征进行分类?

型号:

model = Sequential()
model.add(Conv2D(32, (3, 3), input_shape=(3, 150, 150)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(32, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(64, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Flatten())  # this converts our 3D feature maps to 1D feature vectors
model.add(Dense(64))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(4))
model.add(Activation('softmax'))

提取特征:

layer_name = 'layer_name'
intermediate_layer_model = Model(inputs=model.input,
                                 outputs=model.get_layer(layer_name).output)
intermediate_output = intermediate_layer_model.predict(data)

步骤:

从我的图像数据集中存储这些提取的特征,以便训练 SVM 分类器。

使用train_test_split()分割训练和测试数据

训练分类器:

clf = svm.SVC()
clf.fit(X, y)  

我需要知道怎么做。

【问题讨论】:

你可以试试h5py,或者np.save等...... 你为什么不把输出保存在一个泡菜里? docs.python.org/3/library/pickle.html 能否提供代码示例,好吗? :) 【参考方案1】:

您可以尝试将它们保存并加载为 HDF5 文件格式。与泡菜相比,它有几个优点。保存和加载速度要快得多(尤其是对于大型数组)。

为此,您需要安装 h5py 包。保存加载示例代码如下:

为了节省:

import h5py
h5f = h5py.File('your_file_name.h5', 'w')
h5f.create_dataset('layer_model', data=intermediate_layer_model)
h5f.create_dataset('output', data=intermediate_output)
h5f.close()

用于加载

import h5py
h5f = h5py.File('your_file_name.h5', 'r')
intermediate_layer_model = h5f['layer_model'][:]
intermediate_output = h5f['output'][:]
h5f.close()

【讨论】:

有什么方法可以保存整个数据集的特征,还是我应该一次提取一张图像? 当然,您可以一次保存它们。例如,如果您要从每张图像中提取 64 个特征(比如总共 1000 张图像),您可以将其存储为 HDF5 文件中的 1000x64 numpy 数组。

以上是关于如何存储 CNN 提取的特征来训练 SVM 分类器的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 bagging 集成 SVM 和 CNN 分类器?

如何在特征提取中使用 svm 分类器

图像识别——目标检测入门之 Fast R-CNN

R-CNN常见问题

如何使用两个特征向量训练 svm?

我们如何结合 ANN+CNN 和结合 CNN+SVM?