目录

摘要

模型构建

读取数据集:

CNN模型构建:

模型结构:

训练模型:

结果对比分析:

结束:

摘要

为解决采用 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泛化性还能得到彰显吗?

 

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐