完整的視頻課堂鏈接如下:
完整的視頻課堂投影片連接:
前一課堂筆記連結:
一個圖像分類器如果用 Python 寫出來的樣子會是像這樣的:
def classify_image(image):
# some magic processes here
return class_label
因此目標很簡單,就是利用一系列的算法,把上面所謂的 magic processes 解開,最後實現目標識別的效果。傳統的方式是我們人爲的用很多條件約束去規範和描述一個物體屬性的特徵,然而這個方法既沒辦法普及,更沒辦法提升效率,因此我們使用“數據”去規範數據本身:
- 蒐集圖像裏面的像素格和標籤作爲數據集裏面的數據
- 用機器學習的技巧去訓練分類器
- 使用新的圖像資料去評估這個分類器的準確率
寫出來的程式就像這個樣子:
def train(images, labels): # to memorize all data and labels
# maching learning would be processed here
return model
def predict(model, test_images): # to predict the label of the most similar training image
# use model to predict labels
return test_labels
利用不同標尺之間的差值來比對圖像
import numpy as np
class NearestNeighbor:
def __init__(self):
pass
# X is N*D where each row is an example we wish to predict label for
def train(self, X, y):
# the nearest neighbor classifier simply remembers all the training data
self.Xtr = X
self.ytr = y
def predict(self, X):
num_test = X.shape[0]
# lets make sure that the output 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
但是當我們在使用 K-Nearest 方法去辨識物體的時候,一般不挑臨近只差“一個像素單位”的距離,距離比一還要大的話結果出來會更爲平滑。不過這個方法到了現在已經沒有被用在實際應用上了,其中的壞處很多,包含了:
- 計算時間特長
- 計算標尺與鄰近特定距離標尺之間的關係並不會給我們帶來什麼太有用的訊息
- 這個方法就像以每個訓練數據點爲中心上放上一個對比圖象,並用這個放上去的點的面積去分割原始圖像,因此如果我們希望這個方法準確度高,放的點的“密度”就要足夠大,不然就會失去這個方法的準確性。
拿着張圖當舉例,雖然是同一個人的照片被動了不同的手腳,但是 K-Nearest Neighbor 結果出來的確實一樣的。
有兩個方法可以計算這個所謂“Distance Matrix”
在 L1 的這個 case 裏面,用這個方法判定的數據歸類的邊界會更趨向於貼近座標系的軸來分割所屬區域,而 L2 的話相對來說於座標系的關聯度沒那麼大,所以比較不會有這種情況。
Hyperparameter
在機器學習裏面可能會有很多這種參數,他們不是通過重複的動作被“訓練”出來的,而是根據設計者(我們人)的經驗總結出來的一個可能會讓整個效果更好的參數。因此我們一般設定他們之前會問自己兩個問題:
- 什麼樣的 k 值能夠被最好的使用得出最棒的結果(k 值指的是不同屬性數據間最近的 k 個點的距離)
- 什麼樣的“步距”是最恰當的距離
以下幾種方式可以設定 Hyperparameter(簡稱 HP)
- 找出一個 HP 是最爲擬合已經有的數據的,有極高的準確率與重合性。但是結果顯示,通常這樣的結果都是過擬合的結果,在新來的數據面前,很難繼續有好的擬合效果。
e.g. 一個人被認定爲有眼睛鼻子嘴巴的特徵,過擬合白話地說就是機器“太較真”了,只認定展示給他看有眼睛鼻子嘴巴的那纔是個人,今天來了個眼睛被頭髮遮住的人,於是機器就說這不是人,顯然他過擬合了。 - 把一大塊數據分成訓練用的和測試用的兩部分,找出在訓練中表現最好的 HP ,然後把這個結果套到測試集裏面。但是一般而言這個結果也不怎麼好,因爲訓練出來的 model 我們最主要關心的是它面向新的 data 時的表現,現有的只是一個我們用來預測的依據與手段
- 把一大塊數據分成三份:訓練,驗證,測試。在訓練集中找出最恰當的 HP,然後放到驗證集做進一步確認與修改,最後得出的結果放到測試集去跑分看成績。現實上這是一個比較好的解決方案。
- 交叉驗證法(也是最有公信力,準確性的一種方法),但是不適用於深度學習框架,因爲數據量太大了。把整塊數據分成若干份留一塊給測試集,然後隨機取一塊作爲驗證集,剩下的 n-2 塊全部作爲訓練集找最好的 HP,找到後放到驗證集去,剩下的步驟如第三種方法,最後等所有的塊都當過驗證集後,把所有結果取平均得到最後的結果。雖然這個結果準確,但是耗費太大的計算資源,是個只有理論上可行的方法。
K-Nearest Neighbors 方法總結
- 圖像分類器的建立過程中,我們從圖片訓練集與標籤開始,預測測試集的圖像該是什麼樣子。
- 他預測的方法是根據鄰近的訓練樣本
- 標尺的距離與 k 值都是一種 Hyperparameters
- 從驗證集中被測試好的 HP只在最後放到測試集測試一次
線性分類器 Linear Classification
這就是現在主流被廣泛應用到 CNN的方法, f(x, W) = Wx + b。
一個圖像信息被看作是一個“圖片的長”*“圖片的寬”*“光的三原色的量”的三維矩陣,每一個像素點作爲一個信號源放入到 x 的位置,經過一個權重 W 把 x 的重要性凸顯出來,加上一個獨立的修正量 b ,最後得出一個值用來評分。就像下面這張圖所顯示的意思。
然而,線性分類器在一個類別裏面只能學習一個模板,例如一個類是用來分辨汽車的,就不能再訓練它來分辨動物。如果這種情況出現的話,那新加入的動物圖像數據就會和已有的汽車數據宗和起來,最後得出一個他們共同的四不像答案,一般來說是不好的。
缺點
當遇到高維度向量的時候,線性分類器就會失去原有厲害的分類魔力。
每次只要遇到可以分佈在不同區域的數據的時候,例如上面的例子,沒有一張圖裏面的數據分佈是可以靠直接用一條線切開左右兩邊數據達到分類效果的,那麼線性分類器就會陷入難題。
下節鏈接:卷積神經網絡 + 機器視覺: L3_Loss Functions and Optimization (斯坦福課堂)