2

我正在使用 Vowpal Wabbit 对多类图像进行分类。我的数据集类似于http://www.cs.toronto.edu/~kriz/cifar.html,由 3000 个训练样本和 500 个测试样本组成。特征是 32*32 图像的 RGB 值。我使用 Vowpal Wabbit Logistic 损失函数来训练模型,迭代次数为 100 次。在训练过程中,平均损失低于 0.02(我认为这个数字相当不错吧?)。然后我用输出模型预测训练集的标签,发现预测很糟糕。几乎所有这些都属于第六类。我真的不知道发生了什么,因为在我看来,在训练过程中,预测大部分是正确的,但是在我用模型预测之后,它们突然变成了全部 6。

这是功能的示例线。

1 | 211 174 171 165 161 161 162 163 163 163 163 163 163 163 163 163 162 161 162 163 163 163 163 164 165 167 168 167 168 163 160 187 153 102 96 90 89 90 91 92 92 92 92 92 92 92 92 92 92 92 91 90 90 90 90 90 91 92 94 95 96 99 97 97 98 127 111 71 71 71 71 64 66 66 69 69 69 69 69 69 69 69 69 69 69 69 69 70 70 70 70 69 69 69 71 71 71 71 69 68 68 68 68 68 68 68 68 68 68 68 68 72 64 67 67 67 67 67 67 67 68 67 67 66 67 68 69 68 68 67 66 66 67 69 69 69 71 70 77 89 116 74 76 71 72 74 74 72 73 74 74 74 74 74 74 74 72 72 74 76 76 75 74 74 74 73 73 72 73 74 85 92 123 83 86 86 83 83 82 83 83 83 83 83 82 82 82 82 82 82 82 82 82 82 82 81 80 81 80 81 82 82 85 85 85 84 83 83 83 83 85 85 85 85 85 85 85 86 91 91 91 90 89 89 86 86 86 86 87 89 89 88 88 88 92 92 93 98 100 96 98 96 132 99 101 98 98 97 95 93 93 94 93 93 95 96 97 95 96 96 96 96 95 94 100 103 98 93 95 100 105 103 103 96 139 106 108

这是我的训练脚本:

./vw train.vw --oaa 6 --passes 100 --loss_functionlogistic -c --holdout_off -f image_classification.model

这是我的预测脚本(在训练数据集上):

./vw -i image_classification.model -t train.vw -p train.predict --quiet

以下是训练期间的统计数据:

final_regressor = image_classification.model Num weight bits = 18 learning rate = 0.5 initial_t = 0 power_t = 0.5 decay_learning_rate = 1 using cache_file = train.vw.cache 忽略文本输入有利于缓存输入 num sources = 1 自示例以来的平均值
示例当前当前当前丢失最后一个计数器
weight label predict features 0.000000 0.000000 1 1.0 1 1 3073 0.000000 0.000000 2 2.0 1 1 3073 0.000000 0.000000 4 4.0 1 1 3073 0.000000 0.000000 8 8.0 1 1 3073 0.000000 0.000000 16 16.0 1 1 3073 0.000000 0.000000 32 32.0 1 1 3073 0.000000 0.000000 64 64.0 1 1 3073 0.000000 0.000000 128 128.0 1 1 3073 0.000000 0.000000 256 256.0 1 1 3073 0.001953 0.001953 0.003906 512 512.0 2 2 3073 0.002930 0.002930 0.003906 1024 1024 1024 1024。0 3 3 3073 0.002930 0.002930 2048 2048.0 5 5 3073 0.006836 0.010742 4096 4096.0 3 3 3073 0.012573 0.018311 8192 8192.0 5 5 3073 0.014465 0.016357 16384 16384.0 3 3 3073 0.017029 0.019592 32768 32768.0 6 6 3073 0.017731 0.018433 65536 65536.0 6 6 3073 0.017891 0.018051 131072 131072.0 5 5 3073 0.017975 0.018059 262144 262144.0 3 3 3073014465 0.016357 16384 16384.0 3 3 3073 0.017029 0.019592 32768 32768.0 6 6 3073 0.017731 0.018433 65536 65536.0 6 6 3073 0.017891 0.018051 131072 131072.0 5 5 3073 0.017975 0.018059 262144 262144.0 3 3 3073014465 0.016357 16384 16384.0 3 3 3073 0.017029 0.019592 32768 32768.0 6 6 3073 0.017731 0.018433 65536 65536.0 6 6 3073 0.017891 0.018051 131072 131072.0 5 5 3073 0.017975 0.018059 262144 262144.0 3 3 3073

每次通过的完成运行示例数 = 3000 次使用 = 100 加权示例总和 = 300000.000000 加权标签总和 = 0.000000 平均损失 = 0.017887 总特征数 = 921900000

在我看来,它在训练期间可以完美预测,但是在我使用输出模型后,突然一切都变成了第 6 类。我真的不知道出了什么问题。

4

1 回答 1

5

你的方法有几个问题。

1)我猜训练集首先包含标签为 1 的所有图像,然后是标签为 2 的所有示例,以此类推,最后一个标签为 6。如果要使用在线学习,则需要对此类训练数据进行 shuffle(这是默认设置) VW 中的学习算法)。

2)大众使用稀疏特征格式。一行中的特征顺序并不重要(除非您使用 --ngram)。因此,如果特征编号 1(左上像素的红色通道)的值为 211,而特征编号 2(第二个像素的红色通道)的值为 174,则需要使用:

1 | 1:211 2:147 ...

3)为了在图像识别中获得好的结果,你需要比原始像素值的线性模型更好的东西。不幸的是,大众没有深度学习(多层神经网络),没有卷积网络。您可以尝试--nn X使用一个具有 X 单元(和 tanh 激活函数)的隐藏层来获得神经网络,但这只是CIFAR 等最先进方法的糟糕替代品。您还可以尝试 VW 中可用的其他非线性缩减 ( -q, --cubic, --lrq, --ksvm, --stage_poly)。一般来说,我认为 VW 不适合此类任务(图像识别),除非您应用一些生成(大量)特征(例如 SIFT)的预处理。

4)你过拟合了。

平均损失低于 0.02(我认为这个数字相当不错吧?

不,您使用--holdout_off了 ,因此报告的损失是火车损失。通过简单记忆所有示例(即过拟合)很容易获得几乎为零的训练损失。但是,您希望降低测试(或保持)损失。

于 2015-05-01T18:30:45.713 回答