1. 程式人生 > 其它 >cs231n筆記 -- 2.影象分類

cs231n筆記 -- 2.影象分類

技術標籤:cs231n2016-2017深度學習

目錄

內容框架

資料驅動方法和影象分類問題。

內容

一. 影象分類、資料驅動方法和流程

  1. 資料驅動:
    給計算機很多資料(資料庫,訓練集),然後實現學習演算法,讓計算機學習到每個類的外形。這種方法,就是資料驅動方法。
  2. 影象分類流程:
    影象分類就是輸入一個元素為畫素值的陣列,然後給它分配一個分類標籤。
    流程:
    輸入:輸入是包含N個影象的集合,每個影象的標籤是K種分類標籤中的一種。這個集合稱為訓練集。
    學習:這一步的任務是使用訓練集來學習每個類到底長什麼樣。一般該步驟叫做訓練分類器或者學習一個模型。
    評價:讓分類器來預測它未曾見過的影象的分類標籤,並以此來評價分類器的質量。我們會把分類器預測的標籤和影象真正的分類標籤對比。毫無疑問,分類器預測的分類標籤和影象真正的分類標籤如果一致,那就是好事,這樣的情況越多越好。

二. Nearest Neighbor分類器

  1. 影象分類資料集:CIFAR-10。
    60000張32X32的小影象(50000訓練,10000測試,10個類別)。

  2. 演算法原理:
    將測試圖片與訓練集中每一張圖片去比較,然後將它認為最相似的那個訓練集圖片的標籤賦給這張測試圖片。

  3. 如何比較兩張圖片:
    在本例中,就是比較32x32x3的畫素塊。最簡單的方法就是逐個畫素比較,最後將差異值全部加起來。換句話說,就是將兩張圖片先轉化為兩個向量I1和I2,然後計算他們的L1距離(曼哈頓距離):
    在這裡插入圖片描述
    這裡的求和是針對所有的畫素。
    附L2距離(歐氏距離)公式:
    在這裡插入圖片描述
    L1和L2比較:
    比較這兩個度量方式是挺有意思的。在面對兩個向量之間的差異時,L2比L1更加不能容忍這些差異。也就是說,相對於1個巨大的差異,L2距離更傾向於接受多箇中等程度的差異。L1和L2都是在p-norm常用的特殊形式。

  4. 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

  1. 在實際中,大多使用k-NN分類器,很少用NN分類器。
  2. 為什麼只用最相似的1張圖片的標籤來作為測試影象的標籤呢?這不是很奇怪嗎!是的,使用k-Nearest Neighbor分類器就能做得更好。它的思想很簡單:與其只找最相近的那1個圖片的標籤,我們找最相似的k個圖片的標籤,然後讓他們針對測試圖片進行投票,最後把票數最高的標籤作為對測試圖片的預測。所以當k=1的時候,k-Nearest Neighbor分類器就是Nearest Neighbor分類器。
    從直觀感受上就可以看到,更高的k值可以讓分類的效果更平滑,使得分類器對於異常值更有抵抗力

4. 驗證集、交叉驗證集和超引數調參

5. Nearest Neighbor的優劣

6. 小結

7. 小結:應用kNN實踐

8. 拓展閱讀