【问题标题】:Using SVM classifier as the last layer for a Pre-trained Model(VGG16)使用 SVM 分类器作为预训练模型的最后一层(VGG16)
【发布时间】:2021-10-14 16:23:51
【问题描述】:

我已经使用 Keras 训练了我的 CNN 模型(二元分类),现在我想使用 SVM 分类器而不是使用全连接层进行分类。

我使用 VGG16 预训练网络进行特征提取,还使用了数据增强。

添加SVM作为分类的最后一层的可能方法是什么?

#Parametres  
import keras
from keras.applications import VGG16
import sys
from PIL import Image

#Using VGG16 Pre-trained Model
conv_base = VGG16(weights = 'imagenet',
              include_top = False,
              input_shape=(224, 224, 3))

conv_base.summary()

import numpy as np
import os
from keras.preprocessing.image import ImageDataGenerator

base_dir = 'C:Covid Detection/Code/Dataset-created')
train_dir = os.path.join(base_dir, 'train')
validation_dir = os.path.join(base_dir, 'validation')
test_dir = os.path.join(base_dir, 'test')

from keras import models
from keras import layers

model = models.Sequential()
model.add(conv_base)
model.add(layers.Flatten())
model.add(layers.Dense(256, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))

conv_base.trainable = False

from keras import optimizers

train_datagen = ImageDataGenerator(
    rescale=1./255,
    rotation_range=40,
    width_shift_range=0.2,
    height_shift_range=0.2,
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip=True,
    fill_mode='nearest')

test_datagen = ImageDataGenerator(rescale=1./255)

train_generator = train_datagen.flow_from_directory(
    train_dir,
    target_size=(224, 224),
    batch_size=20,
    class_mode='binary')

validation_generator = test_datagen.flow_from_directory(
    validation_dir,
    target_size=(224, 224),
    batch_size=20,
    class_mode='binary')

# Compile the model
model.compile(loss='binary_crossentropy',
optimizer=optimizers.RMSprop(lr=2e-5),
metrics=['acc'])

# Train the model
history = model.fit_generator(
    train_generator,
    steps_per_epoch=50,
    epochs=30,
    validation_data=validation_generator,
    validation_steps=50)

# Save the model
model.save('vgg16_aug.h5')

【问题讨论】:

    标签: keras


    【解决方案1】:
    from keras.applications.vgg16 import VGG16
    from keras.preprocessing.image import load_img
    from keras.preprocessing.image import img_to_array
    from keras.applications.vgg16 import preprocess_input
    
    
    base_model = VGG16(weights='imagenet')
    model = Model(inputs=base_model.input,      
    outputs=base_model.get_layer('flatten').output)
    model.summary()
    

    创建一个使用 VGG16 提取特征的函数

    def get_features(img_path):
        img = load_img(img_path, target_size=(224, 224))
        x = img_to_array(img)
        x = np.expand_dims(x, axis=0)
        x = preprocess_input(x)
        flatten = model.predict(x)
        return list(flatten[0])
    
    features, labels = [], []
    
    # Loop into the directory of images and extract features and labels
    for image_path in folder:
        features.append(extract_features(image_path))
        labels.append("#some label")
    

    直到这里我们提取了特征和标签,现在我们使用 SVM 训练这些特征如下:-

    from sklearn.model_selection import train_test_split
    from sklearn.svm import LinearSVC
    from sklearn.metrics import accuracy_score
    
    X_train, X_test, y_train, y_test = train_test_split( features, 
                                                         labels, 
                                                         test_size=0.30)
                                             
    
    clf = LinearSVC(random_state=0, tol=1e-5)
    clf.fit(X_train, y_train)
    
    predicted = clf.predict(X_test)
    
    # get the accuracy
    print(accuracy_score(y_test, predicted))
    

    【讨论】:

      猜你喜欢
      • 2021-08-18
      • 2020-10-10
      • 1970-01-01
      • 2018-03-05
      • 2018-12-11
      • 2016-12-08
      • 2021-09-03
      • 2020-08-25
      • 2022-01-23
      相关资源
      最近更新 更多