【目标检测】二、Fast R-CNN与SVD
1.流程
(1) 空間金字塔池化(spatial pyramid pooling,SPP)
原理:
(2)Fast-RCNN
2.數學概念
這么多個全連接層,必然存在計算的性能問題,讓數學家們蠢蠢欲動——基于奇異值分解(singular value decomposition,SVD)的全連接層計算加速方法。
降維(dimensionality reduction)處理主要方式:
|
主成分分析 Principal Component Analysis,PCA |
下文補充 |
|
因子分析 Factor Analysis |
假設觀察的數據當中存在一個隱變量(latent variable),這些數據是由隱變量和噪聲的線性組合而成,如果能找到隱變量,就可以減少觀察數據當中噪聲而達到降維效果。 |
|
獨立成分分析 Independent Component Analysis,ICA |
假設一批數據是由多個數據源混合在一起的,這些數據源應該是相互獨立,沒有關系,若能找到有幾批數據源就可以達到降維效果。 |
(1)PCA
|
(以下若有誤請指正) 解n元一次的方程,得到基礎解系是“基”,所有通解都可以用基礎解系的向量線性表出。 假設解線性方程(n個特征列)中,初等變換后得到化簡系數的矩陣,得到了矩陣的秩r,那么n-r得到n個變量中r個受到約束后剩下的n-r個自由變量。 可以這樣理解,基礎解系是基,由向量組成(是約束下的解的坐標系) 求得的自由變量就是這個基的軸,形如(1,0,0),(0,1,0)這樣表示的三維坐標軸一樣,設第一個軸是(1,0,…,0),第一個軸是(0,1,…,0),第n個軸是(0,0,…,1),得到了這些軸在m維坐標系中的方向(m=r)。每一個自由變量是基的一條軸。 如果能求到特征值和特征向量,再通過形如Av=λv的高維到低維映射,就能達到降維效果,即:矩陣A的數據在特征向量基中的表示。 其中,特征值個數=矩陣的秩,一個特征值帶著一個特征向量。 這個思路下,PCA可以這樣下手: 找到一個基空間(其軸的數目取數據特征列數),確定從原數據的行數據映射(點乘)到基空間的數值,這個數值就是降維結果。 而怎么確定基空間(軸的方向、長度是什么), 從幾何上看,是希望找到一條線,它覆蓋最大差異的數據,然后再找覆蓋次大差異數據的線,以此類推。 |
方差公式σ(Sigma,大寫Σ,小寫σ):
拓展至協方差公式,從某種程度來說,方差也是x的協方差:
協方差矩陣Σ [2],是對稱矩陣:
PCA實現 [3]:
from numpy import *
def pca(dataMat, topNfeat = 999): # shape (m, n), (t)
meanVals = mean(dataMat, axis=0) # 求得平均值
# 求新空間向量(特征向量)
meanRemoved = dataMat - meanVals
covMat = cov(meanRemoved, rowvar=0) # 求協方差矩陣
eigVals, eigVects = linalg.eig(mat(covMat)) # 求協方差矩陣的特征值及特征向量,shape (1, n) , (n, n)
eigValInd = argsort(eigVals) # 特征值排序,shape (1, n)
eigValInd = eigValInd[:-(topNfeat+1):-1] # 取特征值最大的前N個,shape (1, t)
redEigVects = eigVects[:,eigValInd] # 特征值對應的特征向量,shape (n, t)
# 將數據轉換到新空間
lowDDataMat = meanRemoved @ redEigVects # 到低維的映射,其中@是點乘運算符, shape (m,n) (n,t) -> (m,t)
reconMat = (lowDDataMat @ redEigVects.T) + meanVals # 數據還原 shape (m, t) (t, n) -> (m, n)
return lowDDataMat, reconMat
(2)奇異值分解(Singular Value Decomposition,SVD)
在大量數據下的PCA計算代價是很大的,這個時候常用SVD做矩陣分解以減少計算量。
SVD是常用的降維手段,它可以通過隱性語義索引(Latent Semantic Indexing,LSI,或者隱性語義分析Latent Semantic Analysis,LSA)應用到搜索和信息檢索、推薦引擎等。(它希望在搜索一個詞時,能把同義詞映射為同一概念)
Σ(sigma)是一個矩陣,只有對角元素,其它元素為0。它的值就是原數據矩陣Data的奇異值,取Data的特征值開方 ,并且按從大到小的排序。
實現的類庫:
import numpy as np
U, Sigma, Vt = np.linalg.svd(np.array([[1,1],[7,7]]))
U,Sigma,Vt >>> (array([[-0.14142136, -0.98994949],
[-0.98994949, 0.14142136]]),
array([10., 0.]),
array([[-0.70710678, -0.70710678],
[-0.70710678, 0.70710678]]))
注,在大矩陣計算中,計算結果會有些許偏差,這和計算的具體實現相關,但數量級上是不變的,也即:
作矩陣分解的話,可以嘗試還原矩陣,當然這是在小數據上的測試,證明一下分解的可行性,以及導致誤差的可能:
import numpy as np
data = np.array([
[1,1,1,0,0],
[2,2,2,0,0],
[5,5,5,0,0],
[1,1,0,2,2],
[0,0,0,3,3],
[1,1,1,0,0],
[0,0,0,1,1]
])
U, Sigma, Vt = np.linalg.svd(data)
#print('sigma:', Sigma)
sig3 = [[Sigma[0],0,0],[0,Sigma[1],0],[0,0,Sigma[2]]]
sig3 = np.array(sig3)
U[:,:3]@Sig3@Vt[:3,:] # 多個矩陣點乘,除了numpy.linalg.multi_dot和reduce的寫法,numpy(在python 3.5以后)重載了@運算符,A@B直接就是A和B的矩陣乘法。 >>>array([[ 1.00000000e+00, 1.00000000e+00, 1.00000000e+00, -2.85152832e-16, -2.94802231e-16],
[ 2.00000000e+00, 2.00000000e+00, 2.00000000e+00, -1.48291534e-16, -1.67590333e-16],
[ 5.00000000e+00, 5.00000000e+00, 5.00000000e+00, 1.05859966e-16, 5.77213899e-17],
[ 1.00000000e+00, 1.00000000e+00, -1.05947783e-15, 2.00000000e+00, 2.00000000e+00],
[ 1.73854477e-16, 4.09482862e-16, -8.23917306e-16, 3.00000000e+00, 3.00000000e+00],
[ 1.00000000e+00, 1.00000000e+00, 1.00000000e+00, -6.80558595e-17, -7.77052588e-17],
[ 4.44607724e-17, 1.29942461e-16, -2.79696374e-16, 1.00000000e+00, 1.00000000e+00]])
還原當中的Σ只取了3項,這個3如何確定?
一種方式:求得所有奇異值的平方和*0.9作為閾值,再逐個計算奇異值平方和累加到閾值數目為止,以此來確定矩陣Σ的大小;
另一種方式:直接由數據情況來確定,比如說直接指定2000或3000。
SVD的圖像壓縮示例:
def imgCompress(numSV=3, thresh=0.8):
myl = []
for line in open('0_5.txt').readlines():
newRow = []
for i in range(32):
newRow.append(int(line[i]))
myl.append(newRow)
myMat = mat(myl)
print "****original matrix******"
printMat(myMat, thresh)
U,Sigma,VT = la.svd(myMat)
SigRecon = mat(zeros((numSV, numSV))) for k in range(numSV):#construct diagonal matrix from vector
SigRecon[k,k] = Sigma[k] reconMat = U[:,:numSV]@SigRecon@VT[:numSV,:] print "****reconstructed matrix using %d singular values******" % numSV
printMat(reconMat, thresh)
imgTest.txt 內容:
00000000000000110000000000000000
00000000000011111100000000000000
00000000000111111110000000000000
00000000001111111111000000000000
00000000111111111111100000000000
00000001111111111111110000000000
00000000111111111111111000000000
00000000111111100001111100000000
00000001111111000001111100000000
00000011111100000000111100000000
00000011111100000000111110000000
00000011111100000000011110000000
00000011111100000000011110000000
00000001111110000000001111000000
00000011111110000000001111000000
00000011111100000000001111000000
00000001111100000000001111000000
00000011111100000000001111000000
00000001111100000000001111000000
00000001111100000000011111000000
00000000111110000000001111100000
00000000111110000000001111100000
00000000111110000000001111100000
00000000111110000000011111000000
00000000111110000000111111000000
00000000111111000001111110000000
00000000011111111111111110000000
00000000001111111111111110000000
00000000001111111111111110000000
00000000000111111111111000000000
00000000000011111111110000000000
00000000000000111111000000000000
關于SVD的推理/原理,暫且擱置。
|
線性代數有感: 它真的有很多性質,最后接觸已經近乎三年前了,也都忘了,不過遇到也不怕吧,它花里胡哨總歸是為了線性計算;它恁多的性質都是為了計算方便, 此處我只追求,我能get到其型,具體計算就不深入。 |
=======================================================================
資料:
[2] 協方差相關 https://zhuanlan.zhihu.com/p/37609917
[3]Peter Harrington著《機器學習實戰》
杜鵬、諶(chen2)明、蘇統華 編著《深度學習與目標檢測》
總結
以上是生活随笔為你收集整理的【目标检测】二、Fast R-CNN与SVD的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端每日实战:116# 视频演示如何用
- 下一篇: 一周学习总结PPT-学会VLOOKUP函