
# 關于計算機視覺神經網絡深度學習李飛飛Stanford CS231n公開課的筆記。 #首先從完全沒有接觸過神經網絡及計算機學習中的高等數學慢慢一步一步學習記錄學習中的疑點難點。前置一點之前學習python的時候還沒能理解numpy這個庫存在的意義因為當時覺得python不是一種編程語言嘛怎么還需要內嵌一個數學庫。后面才慢慢發現其實好像數學才是代碼的底層邏輯了。進入正題吧首先之前完全沒有接觸過深度學習和神經網絡我指的沒有接觸過是指沒有認真了解過其本質而不是單純的知道這個詞匯然后泛泛而談就像當初AICG一樣其實真正應該是AIGCArtificial Intelligence Gernerated Content人工智能生成內容之所以一直以為是AICG就是因為都是在詞匯上泛泛而談以為是ai生成的cg圖。所以啊一定要了解事物背后的本質。其實這次學習的是計算機深度學習里面的一環就是關于視覺學習的原理之前看李飛飛教授主要是驚訝于她們團隊使用的圖片生成3D高斯潑濺技術后來就來搜關于李飛飛教授的課程了才有了這次Stanford CS231n的公開課。圖像分類器所謂的圖像分類器其實就是輸入一張圖片輸出這張圖片屬于哪一個類別的程序 / 數學模型。比如輸入一張照片輸出青蛙、汽車、貓、狗。向量那么這里就有一個非常關鍵的知識點了就是計算機是通過什么來感知或者說看懂圖像之間的差異的呢。這里潛藏著一個十分核心的要素那就是向量在往后的學習當中會慢慢發現其實所謂的神經網絡深度學習其實非常依賴一樣東西就是向量的轉換把原始輸入像素 / 文字 / 音頻→轉換成數字向量。只有轉化為數字向量這才是計算機能讀懂的語言才能進行后續的一系列操作。圖像分類發展階段模板向量距離匹配L1/L2手工特征 SVM傳統 CVSIFT、HOG單層線性分類多層全連接 MLP帶 ReLU基礎 CNNAlexNet深度改良 CNNVGG、ResNet、EfficientNet、ConvNeXtVision TransformerViT、Swin多模態大模型CLIP 等零樣本分類、自監督預訓練1.模板向量距離匹配我們首先來看看關于模板向量距離匹配的機制其實就是把待測圖片和標準答案圖片模板圖片所有像素上的RGB數值進行向量轉換并且實現flatten鋪平通過L1、L2向量距離計算公式來比對二者圖片間的向量差從而獲得二者圖像吻合度來判斷待測圖片是否是標準答案圖片的類別。這就是非常古早的圖像分類階段了。值得提一嘴的是往后所有的關于向量的計算待測圖片和模板圖片的向量元素必須是一致才能計算這是很基礎的數學底層邏輯就是2*2像素RGB通道的圖片不能和4*4像素CMYK的圖片進行向量計算。L1距離計算曼哈頓距離 ManhattanL1距離計算其實就是把待測圖片和模板圖片所有像素點上的RGB值分別進行相減并取絕對值然后把所有常量相加在一起此時相加的和越小說明二者越接近。L2 距離計算歐氏距離 EuclideanL2距離計算其實是把待測土坯那和模板圖片所有像素點上的RGB值分別進行相減再平方求和后再開根同樣的值越小說明二者越接近。在python中的代碼呈現就是import numpy as np # L1距離 l1_dist np.sum(np.abs(x - x_temp)) # L2距離 l2_dist np.sqrt(np.sum((x - x_temp)**2))L1、L2 向量距離計算是很初階的傳統計算機視覺比對手段直接計算兩張圖像向量之間的差異。之后進階到線性分類器有可訓練的權重\(W、b\)依靠標簽、損失、梯度下降迭代優化正式邁入機器學習。 但線性分類只是單層線性變換缺少非線性激活不屬于深度學習。真正的深度學習從多層網絡 非線性激活ReLU開始只有同時具備多層可訓練權重并且插入非線性激活函數模型才擁有擬合復雜現實模式的能力才算深度學習。2.手工特征 SVM這是深度學習大規模爆發之前工業界主流的圖像分類流水線介于「原始像素 L1/L2 模板匹配」和「神經網絡」中間的一代技術。手工特征hand?crafted feature直接拿原始像素做 L1/L2 距離效果很差圖片稍微平移、亮度變化距離直接亂掉。 于是人設計算法從圖片里提取更穩定的信息HOG提取圖像邊緣、梯度方向物體輪廓SIFT提取關鍵點旋轉、縮放、光照變化依然相對穩定流程輸入原圖 →運行 HOG/SIFT 算法 →輸出一段特征向量。SVM 支持向量機Support Vector MachineSVM 是一個機器學習分類器。 輸入上面提取好的特征向量輸出類別青蛙 / 汽車。SVM 有可訓練參數用標注數據訓練找到一個最優的分割超平面把不同類別分開。SVM 干的活和我們之前學的線性分類器非常像數學內核都是找超平面做分類只是損失函數不一樣。SVM是使用Hinge來計算損失函數而線性分類s xW b是使用Softmax交叉熵損失。 把得分 s 轉成概率分布懲罰 “正確類別概率不夠高”。from sklearn.svm import LinearSVC #線性SVM3.1單層線性分類核心公式關于鋪平Flatten的概念贅述我們假設一張圖片是橫向2像素縱向2像素的RGB三通道圖片那么必定在每一個像素點上都會有對應的RGB數值這樣就會形成一個矩陣而把這樣的一個矩陣平鋪成一個數組序列如[R1,,G1,B1,R2,G2,B2,R3,G3,B3,R4,G4,B4]就是所謂的鋪平Flatten把一個在二維層面的空間信息全部丟掉只保留所有元素的數值所以能夠看到當張量shape 223被鋪平之后就會變成一維有序序列。其實對于單層線性分類整體的核心公式并不難理解W是提前訓練好的權重系數它里面包含了若干圖像標簽的權重系數可以看作是標準答案利用鋪平后的一維向量與W權重系數進行矩陣相乘。得出數值再和b偏置系數相加就得出該待測圖片與當前標簽的得分得分越高越屬于那一類標簽項。矩陣乘法那么接下來就慢慢搞懂幾個概念先首先是xW這里其實是矩陣乘法。其實更加標準應該寫成舉一個最極端的例子假設我們的待測圖片為橫向1像素縱向1像素RGB三通道圖片那么該圖片x.shape 1133個元素分別為R、G、B。我們W權重系數是2種分類分別為青蛙和汽車所以要能對應我們待測圖片使用的W權重系數必定也是每列三個元素。那么如果這個矩陣被鋪平將會得到一個一維序列[RGB]接下來需要和W權重系數進行矩陣其實就是W權重當中的W r_frog * R W g_frog * G W b_frog * B 這樣會得出S frog也就是待測圖片的得分數值如下圖實際運算就是這樣可以看出使用這套W權重計算結果Sfrog 19Scar 12.5明顯19更大所以待測圖片更加偏向于是Frog。那么問題就來了對于x我們可以顯然易見得到假設待測圖片為橫向32像素縱向32像素RGB三通道圖片那么x.shape (32,32,3)一共3072維向量。3.2W權重系數但是W權重系數是怎么得來得呢這就很值得考究了。整體流程總覽初始化 W隨機給初始小數拿一批訓練圖片前向傳播算出得分用損失函數衡量當前這套 W 預測錯得有多離譜求損失對 W 每個元素的梯度往哪個方向改 W損失會變小使用梯度下降更新 W 里面每一個數值循環 2?5反復迭代直到損失不再明顯下降最后拿到訓練完成的權重矩陣 WW 的初始化起點從哪里來W shape(輸入特征數,類別數)例如 3 像素二分類W(3,2)。 一開始 W 全部填很小的隨機數不能全部填 0。如果 W 全部初始化為 0所有輸出得分全部一樣梯度全部為 0模型學不到任何東西。# numpy偽代碼 W 0.01 * np.random.randn(3,2) b np.zeros((2,))訓練數據集修改 W 的依據我們手里有大量標注好的圖片圖片 正確標簽青蛙 / 汽車。W 不是憑空算出來W 的好壞完全由訓練數據決定。 同樣網絡換一套訓練圖片訓練結束得到完全不一樣的 W 矩陣。每次循環拿若干張圖片mini?batch送入網絡\(X_{batch}\)每一行是一張鋪平后的圖片向量輸出 S 每一行是一張圖片各個類別的得分。損失函數 Loss衡量現在 W 有多差核心損失就是一把尺子數值越大 當前 W 預測結果越離譜。 我們的目標不斷修改 W讓 Loss 盡可能變小。修正W的兩大核心分別是數據損失和懲罰項。兩種常見損失① Softmax 交叉熵損失最常用把得分 s 經過 softmax 映射成 0~1 的概率再拿真實標簽計算損失。如果正確類別得分很高錯誤類別得分低 → loss 很小如果正確類別得分很低其他類別得分高 → loss 很大② SVM 鉸鏈損失看正確類別得分要比錯誤類別得分高出一個安全間隔 margin達不到就產生損失。??Loss 是全部樣本的平均損失。 另外還要加上正則懲罰項L1/L2得到總損失所謂的正則化懲罰其實是為了防止W權重為了過渡貼合現有樣本當出現新樣本與W權重系數差異很大但實際上又真的是該標簽時W權重系數矩陣相乘出來得分就會出現誤判。值得注意的是這里的L1、L2是正則化計算跟最初階段的L1、L2向量距離計算不是同一樣東西。很明顯看到L1、L2的正則化公式只針對W權重進行計算與此前的向量距離計算很大不同。這里需要說明下在當中是作為人工寫入的叫做正則化強度超參數用來控制「正則懲罰項」到底有多強。梯度告訴我們 W 往哪個方向調整其實之所以上一個步驟得到損失函數的目的L total其實最大的作用就是為了接下來判斷W該怎么再優化調整.其實我是這么理解的,就是要求出W的正負變化對整體L total的影響是正還是負,正如豆包所說的,其實求導的最大目的并非是要知道怎么去調整W,更多的反而是知道我們現在這樣去調整W方向上是否正確,求導是要知道調整方向而并非知道調整量!!!這是最重要的點.梯度下降更新 W獲取到dW之后,知道了W該往哪個方向調整之后,我們要開始對W進行調整,那么W需要循環優化到什么地步為之最接近正確W呢.這就需要類似計算邊際效用一樣去計算了,正如截圖中所示,和我們之前見過的其實都屬于人工超參數,其邏輯都有點像永真循環中的跳出機制,為了避免計算無休止地進行下去.然后這里會涉及到包括局部最小值和鞍點的知識點,其最核心含義都是為了計算W在循環優化中的函數曲線什么時候達到最平緩,最平緩就證明W權重系數已經相當接近最優解了,那就可以停止運算了.但是也值得注意鞍點和局部最小值的區別,兩者還是有差異的,這里就不作過多深入探討了.以上是計算梯度下降常用的工具.循環迭代epoch不斷重復 前向計算得分 → 算總損失 → 求梯度 dW → 更新 W 循環成千上萬次。隨著迭代進行 W 里面每一個數字被一點點打磨修改。 訓練損失會持續下降模型分類效果越來越好。什么時候停止訓練訓練集損失不再明顯下降看驗證集精度當驗證集精度不再提升甚至開始變差代表出現過擬合就要停止訓練。不能只看訓練集 loss訓練 loss 很低但驗證變差就是過擬合。這正是我們引入正則化的意義。其實這里就是接我們剛剛上一個步驟提到的利用梯度下降的規律來不斷循環計算優化W權重系數,等到W權重系數在優化函數曲線中不再下降,達到平緩曲率就可以停止優化了.超參數的定義全部不能梯度自動算出需要人工調參其實在W權重系數的整體優化運算中,都會有好些人工填入的參數,這里做一個簡單的了解即可.訓練完成之后W 拿來干什么見到來說訓練停止保存最終的 W、b。 訓練到此結束不再修改 W。 推理預測新圖片 新圖片 flatten 得到 x執行 \(\boldsymbol sxWb\)取得分最大類別作為輸出。3.3單層線性分類知識點梳理3.4單層線性分類案例