Stanford大の教材CS231nを使ってNNやCNNを学ぶ.
本記事は,Image Classificationやdata-driven approachについて.下記項目などを学ぶ.
- Data-driven Approach
- k-Nearest Neighbor
- train/val/test splits
Image Classification
- 画像分類問題とは,入力画像に対してラベル付けすること.
- シンプルだが,実用的なアプリは幅広い
- 他のCVタスクも画像分類問題に帰着することが多い.
- 画像分類問題の難しさは,以下の要因により対象が違って画像化されることにある.
- ビューポイント
- スケール
- 変形
- オクルージョン
- 照明状態
- 背景と混ざること
CS231nより引用
- Data-driven approach
(CS231nより引用)
- 画像分類のパイプライン
- 入力されたピクセル列を最終的に1つのラベル化することを行う.
- そのためのパイプラインは下記となる
- 入力
- N枚の画像.K種類のラベルのうち,各画像は1つずつラベルをもつ
- これをtraining setという.
- 学習
- training setを使って,それぞれのクラスがどう見えるかを学習する
- このステップをtraining a classifier,もしくはlearning a modelという.
- 評価
- classifierの質を評価する.
- まだ使っていない画像を使って,真のラベルとclassifierで予測したラベルの比較
- 入力
Nearest Neighbor Classifier
(CS231nより引用)
画像間の距離をどう表すか
- シンプルな2つの方法 を思いつく.
(シンプルなアルゴリズム)
- ピクセルごとの画像間の差異を足していく. $$ d_1(I_1, I_2) = \sum_{p} |I_{1}^{p} - I_{2}^{p} | $$
- ,は画像をベクトル化したもの.
- は画像のベクトルのインデックス
(CS231nより引用)
import numpy as np class NearestNeighbor(object): def __init__(self): pass def train(self, X, y): """ X is N x D where each row is an example. Y is 1-dimension of size N """ # the nearest neighbor classifier simply remembers all the training data self.Xtr = X self.ytr = y def predict(self, X): """ X is N x D where each row is an example we wish to predict label for """ num_test = X.shape[0] # lets make sure that the output type matches the input type Ypred = np.zeros(num_test, dtype = self.ytr.dtype) # loop over all test rows for i in xrange(num_test): # find the nearest training image to the i'th test image # using the L1 distance (sum of absolute value differences) distances = np.sum(np.abs(self.Xtr - X[i,:]), axis = 1) min_index = np.argmin(distances) # get the index with smallest distance Ypred[i] = self.ytr[min_index] # predict the label of the nearest example return Ypred
- accuracyを計算させたら,0.3858だった.
のアルゴリズム
$$ d_2(I_1, I_2) = \sqrt{ \sum_{p} (I_{1}^{p} - I_{2}^{p})^{2} } $$
distances = np.sqrt(np.sum(np.square(self.Xtr - X[i,:]), axis = 1))
- accuracyを計算させたら,0.3539( < L1 )だった.
k-Nearest Neighbor Classifier
- k-Nearest Neighbor Classifierの登場
- 1つのNearest画像だけを使って予測するのはおかしい.
- k個のNearest画像を使う方が良さそう
- 画像を分類する領域を滑らかにすることができる(下図)
(CS231nより引用)
- でもkというパラメータをどう決めるのか
Validation sets for Hyperparameter tuning
- 上記kのパラメータ以外にも,そもそも「どういう距離算出のアルゴリズムを採用するか」についても決める必要がある
- これらの選択はハイパーパラメータと呼ばれる
- 試行錯誤するしかない
- test setをハイパーパラメータの決定に使わないこと
- 過学習(overfit)してしまう
- training setの中からvalidation setを切り出して,ハイパーパラメータに決定に使う.
# assume we have Xtr_rows, Ytr, Xte_rows, Yte as before # recall Xtr_rows is 50,000 x 3072 matrix Xval_rows = Xtr_rows[:1000, :] # take first 1000 for validation Yval = Ytr[:1000] Xtr_rows = Xtr_rows[1000:, :] # keep last 49,000 for train Ytr = Ytr[1000:] # find hyperparameters that work best on the validation set validation_accuracies = [] for k in [1, 3, 5, 10, 20, 50, 100]: # use a particular value of k and evaluation on validation data nn = NearestNeighbor() nn.train(Xtr_rows, Ytr) # here we assume a modified NearestNeighbor class that can take a k as input Yval_predict = nn.predict(Xval_rows, k = k) acc = np.mean(Yval_predict == Yval) print 'accuracy: %f' % (acc,) # keep track of what works on the validation set validation_accuracies.append((k, acc))
- cross-validation
- training setのサイズが小さいときには,もっと効率的にvalidation setを使いたい.
- cross-validationの考え方
- training setを幾つかに分割
- そのうちの1つをvalidationに使う
- その他をtrainingに使う.
- validationに使う部分を順に切り替えていく
- training setを幾つかに分割
(CS231nより引用)
- cross-validationの実際
- cross-validationは計算量が大きいので避けられやすい
Nearest Neighbor classifierの利点,欠点
Nearest Neighbor classifierの利点
- 実装が容易で理解しやすい
- trainingに時間がかからない
- データを保持するだけ
Nearest Neighbor classifierの欠点
- 計算コストがかかる
- test時にtraining setそれぞれと比較をしなければならない
- 本来trainingには時間がかかってもいいが,testは時間をかけたくない
- 直観的に正しくない結果がでることがある
- 下図1(一番左の画像と右の3つはL2距離が全て同一なのに全然違う画像に見える)
(CS231nより引用)
- 直観的に正しくない結果がでることがある
- 下図2(L2距離が近いものを隣接させたもの)
- 背景色が近いと近く配置されてしまう
- 下図2(L2距離が近いものを隣接させたもの)
(CS231nより引用)
Summary
- Image Classification(画像分類)の問題を紹介
- ラベルが付与された画像が与えられる
- 別の画像群に対してラベルを予測し,その正解率を測る.
- Nearest Neighbor classifierという分類器の紹介
- 多くのハイパーパラメータがあることを学んだ
- kの値
- 距離の算出アルゴリズム
- 多くのハイパーパラメータがあることを学んだ
- ハイパーパラメータを決めるときのコツ
- training setを2つに分割
- training set
- validation set
- 異なるハイパーパラメータを試して,ベストなものを求める
- training setを2つに分割
training setが小さい場合,cross validationを用いる
最良なハイパーパラメータが見つかれば,一度だけtest setにかける.
- Nearest NeighborはCIFAR-10のdata setだと40%
- training setを保持するだけで,training時のコストは小さい
- test時のコストが大きい
- L1, L2の距離算出アルゴリズムだと不十分であると結論づけた.
理解できなかった内容
A good image classification model must be invariant to the cross product of all these variations, while simultaneously retaining sensitivity to the inter-class variations.