CNN的上层具有SVM的损失函数

问题描述 投票:1回答:1

你好吗?我正在尝试使用keras cost函数实现SVMsklearn.svm。但是,我总是会出错。我相信问题是将y_true和y_pred张量转换为要在sklearn.svm中使用的numpy数组。然后,我需要将预测结果转换为张量,以用于keras的成本函数(categorical_hinge)。

有人可以帮我吗?

model_input = Input(shape = (img_width, img_height, channel_axis))
x = Convolution2D_bn(model_input, 32, 3, 3, strides=(2, 2), padding='valid')
x = Convolution2D_bn(x, 32, 3, 3, padding='valid')
x = Convolution2D_bn(x, 64, 3, 3)
x = MaxPooling2D((3, 3), strides=(2, 2))(x)

x = Convolution2D_bn(x, 80, 1, 1, padding='valid')
x = Convolution2D_bn(x, 192, 3, 3, padding='valid')
more model
# Classification block
x = GlobalAveragePooling2D()(x)
x = Dense(4096, kernel_regularizer=l2(1e-4), name='Dense_1')(x)
x = Activation('relu', name='relu1')(x)
x = Dropout(DROPOUT)(x)
x = Dense(4096, kernel_regularizer=l2(1e-4), name='Dense_2')(x)
x = Activation('relu', name='relu2')(x)
model_output = Dropout(DROPOUT)(x)
model = Model(model_input, model_output)
model.summary()

import tensorflow as tf
from keras import backend as K
from sklearn.svm import SVC
from sklearn.model_selection import GridSearchCV
from sklearn.preprocessing import StandardScaler
from keras.losses import categorical_hinge
def custom_loss_value(y_true, y_pred):
    X = K.eval(y_pred)
    print(X)
    Y = np.ravel(K.eval(y_true))
    Predict = []
    Prob = []
    scaler = StandardScaler()
    X = scaler.fit_transform(X)
    param_grid = {'C': [0.1, 1, 8, 10], 'gamma': [0.001, 0.01, 0.1, 1]}
    SVM = GridSearchCV(SVC(kernel='rbf',probability=True), cv=3, param_grid=param_grid, scoring='auc', verbose=1)
    SVM.fit(X, Y)
    Final_Model = SVM.best_estimator_
    Predict = Final_Model.predict(X)
    Prob = Final_Model.predict_proba(X)
    return categorical_hinge(tf.convert_to_tensor(Y, dtype=tf.float32), tf.convert_to_tensor(Predict, dtype=tf.float32))

sgd = SGD(lr=0.001, decay=1e-6, momentum=0.9, nesterov=True) 
model.compile(loss=custom_loss_value, optimizer=sgd, metrics=['accuracy'])
tensorflow keras scikit-learn svm hinge-loss
1个回答
0
投票

尝试一下

y_test = np.argmax(y_test , axis=1)
y_pred = np.argmax(y_pred , axis=1)
© www.soinside.com 2019 - 2024. All rights reserved.