cs231n筆記 -- 2.影象分類
阿新 • • 發佈:2020-12-28
技術標籤:cs231n2016-2017深度學習
目錄
內容框架
資料驅動方法和影象分類問題。
內容
一. 影象分類、資料驅動方法和流程
- 資料驅動:
給計算機很多資料(資料庫,訓練集),然後實現學習演算法,讓計算機學習到每個類的外形。這種方法,就是資料驅動方法。 - 影象分類流程:
影象分類就是輸入一個元素為畫素值的陣列,然後給它分配一個分類標籤。
① 輸入:輸入是包含N個影象的集合,每個影象的標籤是K種分類標籤中的一種。這個集合稱為訓練集。
② 學習:這一步的任務是使用訓練集來學習每個類到底長什麼樣。一般該步驟叫做訓練分類器或者學習一個模型。
③ 評價:讓分類器來預測它未曾見過的影象的分類標籤,並以此來評價分類器的質量。我們會把分類器預測的標籤和影象真正的分類標籤對比。毫無疑問,分類器預測的分類標籤和影象真正的分類標籤如果一致,那就是好事,這樣的情況越多越好。
二. Nearest Neighbor分類器
-
影象分類資料集:CIFAR-10。
60000張32X32的小影象(50000訓練,10000測試,10個類別)。 -
演算法原理:
將測試圖片與訓練集中每一張圖片去比較,然後將它認為最相似的那個訓練集圖片的標籤賦給這張測試圖片。 -
如何比較兩張圖片:
在本例中,就是比較32x32x3的畫素塊。最簡單的方法就是逐個畫素比較,最後將差異值全部加起來。換句話說,就是將兩張圖片先轉化為兩個向量I1和I2,然後計算他們的L1距離(曼哈頓距離):
這裡的求和是針對所有的畫素。
附L2距離(歐氏距離)公式:
L1和L2比較:
比較這兩個度量方式是挺有意思的。在面對兩個向量之間的差異時,L2比L1更加不能容忍這些差異。也就是說,相對於1個巨大的差異,L2距離更傾向於接受多箇中等程度的差異。L1和L2都是在p-norm常用的特殊形式。 -
Nearest Neighbor程式碼
import numpy as np
class NearestNeighbor (object):
def __init__(self):
pass
def train(self, X, y):
""" X是N*D,每一行為一個example;y是一維陣列,長度為N"""
self.Xtr = X
self.ytr = y
def predict(self,X_):
""" X_是M*D,每一行為一個待預測標籤的example"""
num_test = X_.shape[0]
# 初始化預測結果Ypred
Ypred = np.zeros(num_test, dtype=self.ytr.dtype)
# 迴圈預測X_的每一行
for i in range(num_test):
# 尋找與i'th測試影象最近鄰的訓練影象
# 採用L1距離公式
distances = np.sum(np.abs(self.Xtr - X_[i]), axis=1)
# 採用L2距離公式
# distances = np.sqrt(np.sum(np.square(self.Xtr - X_[i]), axis=1))
min_index = np.argmin(distances)
Ypred[i] = self.ytr[min_index]
return Ypred
三. k-Nearest Neighbor
- 在實際中,大多使用k-NN分類器,很少用NN分類器。
- 為什麼只用最相似的1張圖片的標籤來作為測試影象的標籤呢?這不是很奇怪嗎!是的,使用k-Nearest Neighbor分類器就能做得更好。它的思想很簡單:與其只找最相近的那1個圖片的標籤,我們找最相似的k個圖片的標籤,然後讓他們針對測試圖片進行投票,最後把票數最高的標籤作為對測試圖片的預測。所以當k=1的時候,k-Nearest Neighbor分類器就是Nearest Neighbor分類器。
從直觀感受上就可以看到,更高的k值可以讓分類的效果更平滑,使得分類器對於異常值更有抵抗力。