目标
- 之前实现的都是写好了一个linear classifier然后直接对输入图片的raw pixel进行分类
- 这部分是先从raw data得到相应的图片特征,然后再对特征进行分类
前面的简单的setup和load data都和之前的一样。
Extract Features
- 对每张图片计算HOG以及在HSV的color space上面的hue channel。(这是两个不同的功能)
- HOG可以提取图片的texture的特征,忽略颜色的影响。而颜色的histogram表示的是颜色而忽略texture,颜色的特征会拉成一个新的vector然后进行分类。
如果我们把这两个东西结合可能会有更好的结果。
在这部分的代码里面,直接给出来了提取hog feature和color histogram的两个function,用这两个直接提取出了特征然后构成了一个新的extract_features,由图片内容和特征组成。
- 然后预处理了特征,减去平均值,除以std(这样大家都在同一个scale里面),最后加上了一个bias的dim
1 | from cs231n.features import * |
训练SVM来处理features
用处理多个类别的SVM来给这些特征分类,得到的结果应该比直接分类得到的结果好。大概结果为0.44左右,注意这里面用的是grid search而不是random search
1 | # Use the validation set to tune the learning rate and regularization strength |
同时也可视化了不是这个类别却被分到这个类别的错误sample:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18# An important way to gain intuition about how an algorithm works is to
# visualize the mistakes that it makes. In this visualization, we show examples
# of images that are misclassified by our current system. The first column
# shows images that our system labeled as "plane" but whose true label is
# something other than "plane".
examples_per_class = 8
classes = ['plane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck']
for cls, cls_name in enumerate(classes):
idxs = np.where((y_test != cls) & (y_test_pred == cls))[0]
idxs = np.random.choice(idxs, examples_per_class, replace=False)
for i, idx in enumerate(idxs):
plt.subplot(examples_per_class, len(classes), i * len(classes) + cls + 1)
plt.imshow(X_test[idx].astype('uint8'))
plt.axis('off')
if i == 0:
plt.title(cls_name)
plt.show()
(感觉自己训练了一个傻子)
用两层的nerual net试试看
- 首先去除上文中bias的dim
- 然后交叉训练,找到最好的参数
- 这部分半天loss下不去的原因主要是lr选的太小了
1 | from cs231n.classifiers.neural_net import TwoLayerNet |
best validation accuracy achieved during cross-validation: 0.605000
best parameter is : (1, 0.0001, 500)
一点感觉
- 感觉要是lr太小的话,即使增加iteration的次数,后面的改变也不大
- lr最基础的范围应该先定下来
- 最后换了换参数居然训出来了60%的val正确率
- test的正确率在55.8左右