TH0*_*000 2 image classification machine-learning vowpalwabbit logistic-regression
我正在使用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 91 92 94 95 96 99 97 98 127 111 71 71 64 66 68 69 69 69 69 69 69 70 70 69 69 70 71 71 69 68 68 68 68 70 72 73 75 78 78 81 96 111 69 68 61 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 83 82 83 83 82 83 83 82 82 82 82 82 82 81 80 82 85 85 84 83 83 83 85 85 85 85 86 94 95 127 92 96 93 93 92 91 91 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 105 102 100 98 98 98 99 99 100 100 95 98 93 81 78 79 77 76 76 79 98 107 102 97 98 103 107 108 99 145 115 118 115 115 115 113 ...... .
这是我的训练脚本:
./vw train.vw --oaa 6 - 通过100 --loss_function logistic -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学习率= 0.5 initial_t = 0 power_t = 0.5 decay_learning_rate = 1使用cache_file = train.vw.cache忽略文本输入以支持高速缓存输入num sources = 1平均值因为
示例当前当前当前当前损失最后计数器
重量标签预测特征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.003906 512 512.0 2 2 3073 0.002930 0.003906 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 3 073 0.017975 0.018059 262144 262144.0 3 3 3073每次通过的完成运行数量示例=使用3000次通过= 100加权示例总和= 300000.000000加权标签总和= 0.000000平均损失= 0.017887总特征数= 921900000
在我看来,它在训练期间完美地预测,但在我使用输出模型之后突然一切都变成了类别6.我真的不知道出了什么问题.
您的方法有几个问题.
1)我猜训练集首先包含标签1的所有图像,然后是标签2的所有示例,依此类推,最后一个标签是6.如果要使用在线学习(默认情况下),需要对这些训练数据进行随机播放大众学习算法).
2)VW使用稀疏特征格式.一行上的功能顺序并不重要(除非您使用--ngram).因此,如果要素编号1(左上角像素的红色通道)的值为211,而要素编号2(第二个像素的红色通道)的值为174,则需要使用:
1 | 1:211 2:147 ...
Run Code Online (Sandbox Code Playgroud)
3)为了在图像识别中获得良好的结果,您需要比原始像素值上的线性模型更好的东西.不幸的是,大众没有深度学习(多层神经网络),没有卷积网络.您可以尝试--nn X使用具有X个单位的隐藏层(以及tanh激活函数)来获取神经网络,但这只是对CIFAR等最先进方法的不良替代.您也可以尝试使用其他非线性削减VW( ,-q,--cubic,--lrq,).--ksvm --stage_poly一般来说,我认为大众不适合这样的任务(图像识别),除非你应用一些产生(很多)功能的预处理(例如SIFT).
4)你过度拟合.
平均损失低于0.02(我假设这个数字非常好吗?
不,你使用过--holdout_off,所以报告的损失是火车损失.通过简单记忆所有例子,即过度拟合,很容易使列车损失几乎为零.但是,您希望测试(或保持)损失较低.
| 归档时间: |
|
| 查看次数: |
496 次 |
| 最近记录: |