这一次的作业是对SVM和2-layer-net的对比
我们可以通过在输入图像的像素上训练线性分类器来实现对图像分类任务的合理性能。在这个练习中,我们将展示我们训练图像的特征而不是像素所带来的表现。
前几个操作跟之前的类似
In[1]:
import random
import numpy as np
from cs231n.data_utils import load_CIFAR10
import matplotlib.pyplot as plt
from __future__ import print_function
#%matplotlib inline
plt.rcParams['figure.figsize'] = (10.0, 8.0) # set default size of plots
plt.rcParams['image.interpolation'] = 'nearest'
plt.rcParams['image.cmap'] = 'gray'
%load_ext autoreload
%autoreload 2
载入数据
In[2]:
from cs231n.features import color_histogram_hsv, hog_feature
def get_CIFAR10_data(num_training=49000, num_validation=1000, num_test=1000):
cifar10_dir = 'cs231n/datasets/cifar-10-batches-py'
X_train, y_train, X_test, y_test = load_CIFAR10(cifar10_dir)
mask = list(range(num_training, num_training + num_validation))
X_val = X_train[mask]
y_val = y_train[mask]
mask = list(range(num_training))
X_train = X_train[mask]
y_train = y_train[mask]
mask = list(range(num_test))
X_test = X_test[mask]
y_test = y_test[mask]
return X_train, y_train, X_val, y_val, X_test, y_test
try:
del X_train, y_train
del X_test, y_test
print('Clear previously loaded data.')
except:
pass
X_train, y_train, X_val, y_val, X_test, y_test = get_CIFAR10_data()
提取的特征
对于每个图像,我们将计算一个面向梯度直方图(HOG)和一个颜色直方图,我们通过连接HOG和颜色直方图特征向量来形成每个图像的最终特征向量。
粗略地说,HOG应该捕获图像的纹理而忽略颜色信息,颜色直方图表示输入图像的颜色而忽略纹理。因此,我们期望将两者结合使用应该比单独使用两者更好。为了你的利益,验证这个假设是一件好事。
hog_feature和color_histogram_hsv函数都对单个图像进行操作,并返回该图像的特征向量。extract_features函数接受一组图像和一组特征函数,并对每个图像计算每个特征函数,将结果存储在一个矩阵中,其中的每一列是单个图像的所有特征向量的连接。
关于HOG,可以参考HOG特征(知乎)
ln[3]:
from cs231n.features import *
num_color_bins = 10 # Number of bins in the color histogram
feature_fns = [hog_feature, lambda img: color_histogram_hsv(img, nbin=num_color_bins)]
X_train_feats = extract_features