我想在128d嵌入矢量数组上同时训练KNN和SVC以进行人脸识别,但是经过训练,knn和svc的精度均为0.0。
[奇怪的是,如果我训练一组约5人,则累计显示为0.6〜0.7,但是这里我训练一组约5000人,则返回0.0精度。
import numpy as np
import cv2
import json
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from keras.models import Sequential, Model
from keras.layers import *
from keras.optimizers import *
import tensorflow as tf
from keras import backend as K
import h5py
from keras.applications.inception_resnet_v2 import InceptionResNetV2
from sklearn.metrics import accuracy_score
import time
import pickle
def convnet_model_():
initial_inceptionv2_model = InceptionResNetV2(weights=None, include_top = False, input_shape = (160, 160, 1))
x = initial_inceptionv2_model.output
x = GlobalAveragePooling2D()(x)
x = Dense(4096, activation = 'relu')(x)
x = Dropout(0.6)(x)
x = Dense(4096, activation = 'relu')(x)
x = Dropout(0.6)(x)
x = Lambda(lambda x: K.l2_normalize(x, axis = 1))(x)
convnet_model = Model(inputs=initial_inceptionv2_model.input, outputs = x)
return convnet_model
def deep_rank_model():
convnet_model = convnet_model_()
first_input = Input(shape = (160, 160, 1))
first_conv = Conv2D(96, kernel_size = (8, 8), strides = (16, 16), padding = 'same')(first_input)
first_max = MaxPool2D(pool_size = (3, 3), strides = (2, 2), padding = 'same')(first_conv)
first_max = Flatten()(first_max)
first_max = Lambda(lambda x: K.l2_normalize(x, axis =1))(first_max)
second_input = Input(shape = (160, 160, 1))
second_conv = Conv2D(96, kernel_size = (8, 8), strides = (32, 32), padding = 'same')(second_input)
second_max = MaxPool2D(pool_size = (7, 7), strides = (4, 4), padding = 'same')(second_conv)
second_max = Flatten()(second_max)
second_max = Lambda(lambda x: K.l2_normalize(x, axis = 1))(second_max)
merge_one = concatenate([first_max, second_max])
merge_two = concatenate([merge_one, convnet_model.output])
emb = Dense(4096)(merge_two)
emb = Dense(128)(emb)
l2_norm_final = Lambda(lambda x: K.l2_normalize(x, axis = 1))(emb)
final_model = Model(inputs = [first_input, second_input, convnet_model.input], outputs = l2_norm_final)
return final_model
print("Model: ")
deep_rank_model = deep_rank_model()
from keras.models import load_model
print("Loading pre-trained weight")
deep_rank_model.load_weights("/home/fr/models/model.hdf5")
from tqdm import tqdm
print("Loading data... ")
with open('/home/fr/jsons/X_train_triplet_lfw160.pkl', 'rb') as f:
X = pickle.load(f)
X = np.array(X)
X = np.expand_dims(X, axis=3)
with open('/home/fr/jsons/y_train_triplet_lfw160.pkl', 'rb') as f:
y = pickle.load(f)
y = np.array(y)
with open('/home/fr/jsons/name_map_lfw160.pkl', 'rb') as f:
name_map = pickle.load(f)
with open('/home/fr/jsons/emb128.json', 'r') as f:
embs128 = json.load(f)
embs128 = np.array(embs128)
from sklearn.preprocessing import LabelEncoder
from sklearn.neighbors import KNeighborsClassifier
from sklearn.svm import LinearSVC
print("X: ", np.shape(X))
print("y: ", np.shape(y))
print("name_map: ", np.shape(name_map))
print("embs128: ", np.shape(embs128))
encoder = LabelEncoder()
encoder.fit(y)
total = np.arange(X.shape[0])
print("Total: ", total)
X = embs128[total]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, shuffle = False) #random_state = 42, shuffle = True)
knn = KNeighborsClassifier(n_neighbors=1, metric='euclidean')
svc = LinearSVC()
print("Knn training... ")
knn.fit(X_train, y_train)
svc.fit(X_train, y_train)
acc_knn = accuracy_score(y_test, knn.predict(X_test))
acc_svc = accuracy_score(y_test, svc.predict(X_test))
print(f'KNN accuracy = {acc_knn}, SVM accuracy = {acc_svc}')
任何人在该领域都有经验,请给我一些建议吗?我现在有麻烦了。
我也有同样的问题
import pandas as pd
import numpy as np
from sklearn import preprocessing, neighbors
from sklearn.model_selection import train_test_split
data = pd.read_csv('carbon.csv')
X = np.array(data.drop(['year'], 1))
y = np.array(data['year'])
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
clf = neighbors.KNeighborsClassifier()
clf.fit(X_train, y_train)
accuracy = clf.score(X_test, y_test)
print(accuracy)
准确性= 0.0
大声笑