即使使用训练d,LIBSVM也不能准确预测

2024-04-24 05:05:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我有下面的代码,它获取一组图像,每个训练集中大约50个图像,然后创建一个线性模型并尝试对数据进行分类。我也有一个测试集,但它甚至不能对训练数据进行任何准确的分类。我加载图像的方式有什么错误吗?如果有帮助的话,我很乐意提供更多的代码或输出。在

def create_image_list(file_path):
    image_list = []
    for filename in glob.glob(file_path):
        img = Image.open(filename)
        img_resized = img.resize((32, 32), Image.ANTIALIAS)
        pix = img.load()
        pixlist = []
        for x in range(0, 32):
            for y in range(0,32):
                pixlist.append(pix[x,y][0])
                pixlist.append(pix[x,y][1])
                pixlist.append(pix[x,y][2])
        image_list.append(pixlist)
    return image_list

dalmation_training = create_image_list('/images/dalmatian/training/*')
dollabill_training = create_image_list('/images/dollar_bill/training/*')
pizza_training = create_image_list('/images/pizza/training/*')
soccer_ball_training = create_image_list('/images/soccer_ball/training/*')
sunflower_training = create_image_list('/images/sunflower/training/*')

c = '1e2'
testing_set = dalmation_training + dollabill_training + pizza_training + soccer_ball_training + sunflower_training

dalmation_y = [1]*len(dalmation_training ) + [-1]*len(dollabill_training) + [-1]*len(pizza_training) + [-1]*len(soccer_ball_training) + [-1]*len(sunflower_training)
dalmation_model_linear = svm_train(dalmation_y, testing_set, '-t 0 -c %s -b 1 -q' % c)

dollabill_y = [-1]*len(dalmation_training ) + [1]*len(dollabill_training) + [-1]*len(pizza_training) + [-1]*len(soccer_ball_training) + [-1]*len(sunflower_training)
dollabill_model_linear = svm_train(dollabill_y, testing_set, "-t 0 -c %s -b 1 -q" % c)

pizza_y = [-1]*len(dalmation_training ) + [-1]*len(dollabill_training) + [1]*len(pizza_training) + [-1]*len(soccer_ball_training) + [-1]*len(sunflower_training)
pizza_model_linear = svm_train(pizza_y, testing_set, "-t 0 -c %s -b 1 -q" % c)

soccer_ball_y = [-1]*len(dalmation_training ) + [-1]*len(dollabill_training) + [-1]*len(pizza_training) + [1]*len(soccer_ball_training) + [-1]*len(sunflower_training)
soccer_ball_model_linear = svm_train(soccer_ball_y, testing_set, "-t 0 -c %s -b 1 -q" % c)

sunflower_y = [-1]*len(dalmation_training) + [-1]*len(dollabill_training) + [-1]*len(pizza_training) + [-1]*len(soccer_ball_training) + [1]*len(sunflower_training)
sunflower_model_linear = svm_train(sunflower_y, testing_set, "-t 0 -c %s -b 1 -q" % c)

print 'dalmation linear'
result1, something, p1 = svm_predict([1]*len(testing_set), testing_set, dalmation_model_linear, "-b 1")
print 'dollabill linear'
result2, something, p2 = svm_predict([1]*len(testing_set), testing_set, dollabill_model_linear, "-b 1")
print 'pizza linear'
result3, something, p3 = svm_predict([1]*len(testing_set), testing_set, pizza_model_linear, "-b 1")
print 'soccer linear'
result4, something, p4 = svm_predict([1]*len(testing_set), testing_set, soccer_ball_model_linear, "-b 1")
print 'sunflower linear'
result5, something, p5 = svm_predict([1]*len(testing_set), testing_set, sunflower_model_linear, "-b 1")

当我运行这个数据集并运行一些精度测量时,每次使用最后一个数据集时,它大约是20%,向日葵的准确率接近100%,其他的接近5%。我相信我把它放在libsvm的正确格式中,我找不到任何线索。我试过从1e-8到1e8的不同c值,每一个的准确度变化不超过5%。在

任何意见都将非常感谢,我很乐意提供更多的信息!在


Tags: imagemodellentrainingtestinglistlinearset
1条回答
网友
1楼 · 发布于 2024-04-24 05:05:03
  1. 在你的设计中有一个很大的假设,那就是“在多个类的每个样本中,所有像素的RGB像素值创建了可线性区分的独特模式”。根据我的经验,这不是真的。大多数使用支持向量机处理图像分类问题的人在图像中寻找比单纯的RGB或强度值更高的特征(例如边缘、角点等),并且已经有一些已知的技术在提取有用的特征(例如HOG用于行人检测)方面工作得比较好。这是到目前为止代码中最大的问题,尽管您可能认为接下来的三个部分会更好地回答您关于准确性问题的问题。在
  2. 你的消极训练是积极训练的4倍。默认情况下,Libsvm不能很好地处理训练中的这种偏差,导致超平面严重倾斜。不管怎样,所有当前的支持向量机模型对所有测试样本都返回-1。在准备训练集时,通过随机选择一些阴性样本来调整阴性的数量,使其几乎与阳性样本的数量相匹配。在
  3. 你的测试设计不正确。您正在将整个testing_set列表传递给svm_predict,对于真正的标签,您传递{},这是不正确的。对于dalmation模型,真正的类值应该是前面计算的dalmation_y。在
  4. 请记住,您在这里所做的是“在训练样本上测试精度”,这不是一种可以接受的测量精度的方法。相反,您需要将整个样本集拆分为培训和测试,甚至更好地分为培训、验证和测试三个部分,其中培训大约是测试集的3-4倍,然后使用培训集对模型进行培训,并在测试集上进行测试。在

相关问题 更多 >