我正在创建Viola-Jones算法的自定义实现。当我训练分类器并评估其准确性时,它可以准确地对1000个示例中的462个进行准确分类。但是,当我从一个pickle文件中加载相同的模型并在同一数据集上测试其准确性时,其准确性突然变成了千分之九千。
我尝试更改算法的超参数,但是训练后立即的精度始终为462/1000,这是数据集中的否定示例数。我相信这意味着clf.classify(x)
总是返回0,但是我不明白为什么当我从泡菜文件中加载模型时,情况不再如此。
training = training[0:1000] #An array of tuples, first element in each tuple is a numpy array, the second is its classification
try:
clf = ViolaJones.load("viola_jones") #Loads classifier from pickle
print("Loaded classifier from file")
except Exception as e:
print("Failed to load classifier from file: %s" % str(e))
pos_num, neg_num = 0, 0
for x, y in training:
if y == 1:
pos_num += 1
else:
neg_num += 1
clf = ViolaJones(feature_num=2)
clf.train(training, pos_num, neg_num)
clf.save("viola_jones") #Saves classifier to pickle
correct = 0
for x, y in training:
prediction = clf.classify(x)
correct += prediction == y
print("Correctly labeled %d out of %d training examples" % (correct, len(training)))
我运行了一次文件以训练模型,评估模型并将其保存到文件中(为了简单起见,我将训练集用于训练和评估,尽管我知道这是不好的做法)。再次运行文件时,它将从文件中加载模型并进行评估。预先感谢。
答案 0 :(得分:0)
我发现在clf.train
函数中,我通过要素工程更改了training
数组,因为该数组是通过引用传递的。这就是为什么该模型在训练后立即在评估上表现不佳的原因,因为它是基于工程特征的有效工程特征。在评估之前重新加载培训数据可以解决该问题。