CNN+SVM模型实现图形多分类任务(SVM替换softmax分类器)
目录摘要模型构建读取数据集:CNN模型构建:模型结构:训练模型:结果对比分析:结束:摘要为解决采用 softmax 作为卷积神经网络分类器导致图形分类识别模型泛化能力的不足,不能较好适用图像分类等问题,本次博客使用SVM代替CNN网络的softmax分类层,即CNN提取特征后利用SVM进行分类。为了验证模型更改后的效果,本次在随机构建的垃圾分类数据集上做了一...
目录
摘要
为解决采用 softmax 作为卷积神经网络分类器导致图形分类识别模型泛化能力的不足,不能较好适用图像分类等问题,本次博客使用SVM代替CNN网络的softmax分类层,即CNN提取特征后利用SVM进行分类。为了验证模型更改后的效果,本次在随机构建的垃圾分类数据集上做了一个简单的验证性实验。以验证SVM替换softmax分类器正确进行图像分类的效果。
模型构建
垃圾图像数据为随机选择的一部分数据,总共2143张图片,6个类别。采用train_test_split函数进行随机分割数据,75%作为训练集,其他的作为测试集。为了加快训练速度,采用resize函数实现图像的缩小。这也是导致整体准确率不高的一个原因。
读取数据集:
for imagePath in imagePaths:
# load the image, pre-process it, and store it in the data list
image = cv2.imread(imagePath)
image = cv2.resize(image, (norm_size, norm_size))
image = img_to_array(image)
data.append(image)
# extract the class label from the image path and update the
# labels list
label = int(imagePath.split(os.path.sep)[-2])
labels.append(label)
data = np.array(data, dtype="float") / 255.0
labels = np.array(labels)
(trainX, testX, trainY, testY) = train_test_split(data,labels, test_size=0.25, random_state=42)
# convert the labels from integers to vectors
trainY = to_categorical(trainY, num_classes=CLASS_NUM)
trainY = np.array(trainY)
trainY = np.argmax(trainY, axis=1)
testY = to_categorical(testY, num_classes=CLASS_NUM)
testY = np.array(testY)
testY = np.argmax(testY, axis=1)
CNN模型构建:
model = Sequential()
inputShape = (64, 64, 3)
model.add(Conv2D(20, (5, 5), padding="same", input_shape=inputShape))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
# second set of CONV => RELU => POOL layers
model.add(Conv2D(50, (5, 5), padding="same"))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
# first (and only) set of FC => RELU layers
model.add(Flatten())
model.add(Dense(500))
model.add(Activation("relu"))
# softmax classifier
model.add(Dense(6))
model.add(Activation("softmax"))
model.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['accuracy'])
return model
模型结构:
训练模型:
from keras_svm.model_svm_wrapper import ModelSVMWrapper#导入SVM包,上篇博客给出了源码
wrapper = ModelSVMWrapper(build_model())
wrapper.model.summary()
train_images=trainX
train_labels=trainY
test_images=testX
test_labels=testY
for j in range(5):
wrapper = ModelSVMWrapper(build_model())
epochs = 10
performance = {
"cnnwith_svm-acc": [],
"cnnwithout_svm-acc": []
}
for i in range(epochs):
print('Starting epoch: {}'.format(i + 1))
wrapper.fit(train_images, train_labels, epochs=1, batch_size=64)
performance["cnnwith_svm-acc"].append(wrapper.evaluate(test_images, test_labels))
performance["cnnwithout_svm-acc"].append(
wrapper.model.evaluate(test_images, to_categorical(test_labels))[1])
结果对比分析:
训练同样批次后,为了实现精确的结果比较,其每次训练完成后在测试集上得到的结果输出为:
{'cnnwith_svm-acc': [0.5018656716417911, 0.48880597014925375, 0.5485074626865671, 0.6044776119402985, 0.5802238805970149, 0.6324626865671642, 0.6231343283582089, 0.5597014925373134, 0.582089552238806, 0.5970149253731343], 'cnnwithout_svm-acc': [0.24067164179104478, 0.21828358208955223, 0.38619403029555704, 0.3302238810418257, 0.39738805970149255, 0.5018656720866018, 0.4626865676089899, 0.44589552194324894, 0.44029850701787576, 0.42910447850156186]}
结束:
本次针对图像分类任务上采用 softmax 作为卷积神经网络分类器导致模型泛化能力不足,不能较好适应垃圾图像分类的问题,测试了采用SVM方法替换softmax分类函数的性能。充分利用卷积神经网络自动提取特还能征的优势,及SVM分类器能够增强模型的鲁棒性和泛化性。通过对垃圾分类数据集的实现结果比较,证明SVM替换Softmax对测试集来说确实具有一定的泛化性能。但是仍有不足之处,疑点主要是两个问题:
1.如果训练次数及卷积神经网络模型层数足够多,训练卷积过程足够好,softmax分类器同样能够取得不错结果,那么SVM作为分类器还能有效果的提升吗?
2.SVM只是进行了图像分类任务,且大图像被处理为64*64形式,如果采用原始图像特征作为输入,SVM泛化性还能得到彰显吗?
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)