CS231n 斯坦福深度视觉识别课 学习笔记(完结)
課程地址
第1章 CS231n課程介紹
---1.1計(jì)算機(jī)視覺概述
這門課的主要內(nèi)容是計(jì)算機(jī)視覺.它是一門需要涉及很多其他科目知識(shí)的學(xué)科.
視覺數(shù)據(jù)占據(jù)了互聯(lián)網(wǎng)的絕大多數(shù),但是它們很難利用.
---1.2計(jì)算機(jī)視覺歷史背景
為了獲得一副3D圖像,我們需要經(jīng)歷原始圖像(端點(diǎn),曲線,邊緣)->2.5維草圖(場景的不連續(xù)性)->3D圖像幾個(gè)過程.
70年代:每個(gè)對象由簡單的幾何圖單位組成
80年代:如何識(shí)別由簡單物體構(gòu)成的視覺空間
如果目標(biāo)識(shí)別太難了,應(yīng)該先進(jìn)行圖像分割.
可以使用圖片中的特征來進(jìn)行圖像識(shí)別.
圖像特征的維度一般很高,因此算法很容易過擬合.
ImageNet是一個(gè)很大的目標(biāo)識(shí)別數(shù)據(jù)集,相關(guān)比賽往往使用top5標(biāo)準(zhǔn)來衡量.
---1.3課程后勤
介紹了本門課的內(nèi)容:圖像識(shí)別,目標(biāo)檢測,風(fēng)格遷移,如何從零開始構(gòu)建CNN,以及tensorflow等框架的使用等.
深度學(xué)習(xí)流行的主要原因是計(jì)算能力的提高和數(shù)據(jù)量的增長.
第2章圖像分類
---2.1圖像分類-數(shù)據(jù)驅(qū)動(dòng)方法
計(jì)算機(jī)存儲(chǔ)圖像的方式是二維或三維矩陣.一個(gè)物體與計(jì)算機(jī)實(shí)際看到的像素值之間的差距稱為語義鴻溝.
一個(gè)具有魯棒性的圖像識(shí)別算法應(yīng)該能從不同角度,光照條件,變形,遮擋,類內(nèi)條件差異等條件下識(shí)別出物體類別.
邊緣對于視覺識(shí)別是十分重要的.但是基于邊緣的規(guī)則識(shí)別算法不是一種好方法.
數(shù)據(jù)驅(qū)動(dòng)的分類方法是指:
收集具有標(biāo)注的圖片數(shù)據(jù)集(CIFAR10).
使用機(jī)器學(xué)習(xí)來訓(xùn)練分類器.
使用模型來預(yù)測新的圖片.
最近鄰(NearestNeighbors)算法:
不進(jìn)行訓(xùn)練,只是單純地存儲(chǔ)所有的數(shù)據(jù)集,然后對于要預(yù)測的圖片,從數(shù)據(jù)集中找出與它最相似的圖片的標(biāo)簽作為輸出.
訓(xùn)練時(shí)間很短,預(yù)測時(shí)間很長.這與我們理想中的圖像識(shí)別算法相反.
最近鄰算法很容易出現(xiàn)誤分類,因此出現(xiàn)了K近鄰(K-NearestNeighbors)算法:選出K個(gè)最近點(diǎn),然后進(jìn)行多數(shù)投票決定輸出.
---2.2圖像分類-K近鄰算法
距離函數(shù)是K近鄰算法的關(guān)鍵.常用的有L1距離,L2距離等.通過不同的距離函數(shù)還可以將K近鄰算法泛化到任何類型的數(shù)據(jù)上.
K近鄰算法中的K值和距離函數(shù)就是典型的超參數(shù):需要人為設(shè)置,而不能由算法學(xué)習(xí)得到.選擇超參數(shù)的常見作法就是將數(shù)據(jù)集分為訓(xùn)練集,驗(yàn)證集,測試集.使用驗(yàn)證集來選擇超參數(shù),并在測試集得到結(jié)果.如果數(shù)據(jù)集較小,還可以采用交叉驗(yàn)證的方法進(jìn)行選擇.
實(shí)際上K近鄰算法很少在圖像數(shù)據(jù)中應(yīng)用,因?yàn)樗A(yù)測時(shí)間很長,而且距離函數(shù)很難度量圖像數(shù)據(jù).
---2.3圖像分類-線性分類I
線性分類器是參數(shù)模型中最簡單的例子.它實(shí)際上是關(guān)于輸入數(shù)據(jù)x和權(quán)重W的函數(shù),輸出代表了預(yù)測的類別.
線性分類器實(shí)際上是用一個(gè)模版來匹配圖像,所以它對于多模態(tài)類別的預(yù)測能力較差.另外從幾何角度上看,線性分類器是用一個(gè)線性平面來將某一類別與其他類別劃分開來,因此很難處理奇偶或多分類問題.
第3章?lián)p失函數(shù)和優(yōu)化
---3.1損失函數(shù)
為了得到線性分類器的權(quán)重,引入了損失函數(shù)來定量地衡量權(quán)重的好壞.最小化損失函數(shù)的過程是一個(gè)優(yōu)化過程.
損失函數(shù)就是一個(gè)關(guān)于預(yù)測值和真實(shí)值的函數(shù).
多分類SVM
損失函數(shù):如果真實(shí)分類的分?jǐn)?shù)大于其他分?jǐn)?shù)+邊界(margin),則損失=0,否則損失=其他分?jǐn)?shù)-真實(shí)分?jǐn)?shù)+邊界.邊界的值可以任意選擇,因?yàn)檫@個(gè)參數(shù)最終會(huì)消失.用公示表示為,,也稱為hinge損失.
初次迭代時(shí)損失函數(shù)的值應(yīng)該約為分類的數(shù)量減去1.
假如有一組W使得損失函數(shù)為0,那么2W的損失函數(shù)也應(yīng)該為0.這就使得有無窮多組權(quán)重,分類器將無法抉擇.因此需要加入超參數(shù)λR(W)作為正則化項(xiàng),R(W)有L2范數(shù),L1范數(shù),彈性網(wǎng)絡(luò),最大規(guī)范等正則化選項(xiàng).正則化的目的就是減輕模型復(fù)雜度.
SVM只關(guān)心正確分類是否比其他分類高出一個(gè)邊界.
Softmax:
數(shù)據(jù)的softmax值是
對應(yīng)的損失函數(shù)值是,也稱為交叉熵?fù)p失.
初次迭代時(shí)損失函數(shù)的值應(yīng)該約為log(C),C為分類數(shù).
softmax會(huì)不斷提高正確分類的概率分布.
---3.2優(yōu)化
優(yōu)化的過程可以想象為在一座山中尋找山谷.
梯度下降法是最常用的優(yōu)化方法.
負(fù)梯度方向是函數(shù)下降最快的方向.
首先隨機(jī)初始化權(quán)重,然后計(jì)算梯度,接著朝梯度最小的方向前進(jìn)一小步.
步長是一個(gè)超參數(shù),最好在初始時(shí)選擇較大步長,然后逐漸縮小.
隨機(jī)梯度下降(SGD)只選取小批量(minibatch)數(shù)據(jù)進(jìn)行估算,可以提升速度.
梯度可由解析梯度(先計(jì)算出梯度公式,再代入數(shù)值)和數(shù)值梯度(代入一個(gè)δ和數(shù)值計(jì)算)計(jì)算,數(shù)據(jù)維度高時(shí)前者速度較快.
圖像分類直接輸入原始像素值并不好,常用方式是計(jì)算圖片的特征代表,然后將這些特征向量合在一起,傳入線性分類器.常用的特征表示有顏色直方圖,方向梯度直方圖,詞袋等.這種方式與神經(jīng)網(wǎng)絡(luò)有些相似,區(qū)別是我們的數(shù)據(jù)劃分方式將由神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)得到.
第4章介紹神經(jīng)網(wǎng)絡(luò)
---4.1反向傳播
反向傳播:
給定輸入值后,進(jìn)行前向傳播,可以得到輸出值.
反向傳播實(shí)際上是鏈?zhǔn)椒▌t的遞歸調(diào)用,逐層從后往前,可以求出輸出值對每個(gè)輸入的導(dǎo)數(shù).
反向傳播的連續(xù)節(jié)點(diǎn)可以任意組合,只要對這個(gè)整體求導(dǎo)即可.
max門的后向傳播與前向傳播類似,它只將梯度傳遞給最大值對應(yīng)的節(jié)點(diǎn).
沿著梯度方向前進(jìn)一個(gè)步長,就更新了權(quán)重.
---4.2神經(jīng)網(wǎng)絡(luò)
通過不同的函數(shù)疊加,就可以使單層的線性分類器變?yōu)槎鄬拥?strong>神經(jīng)網(wǎng)絡(luò)乃至深度網(wǎng)絡(luò).
---作業(yè)2
Fully-ConnectdNeuralNets:
將每一種層的類型通過前向傳播和反向傳播來實(shí)現(xiàn)模塊化
全連接層前向傳播:將輸入x通過reshape展開后,和權(quán)重w點(diǎn)乘并加上偏差b.
全連接層后向傳播:分別對wx+b求導(dǎo),得到dx是上層梯度dout和權(quán)重w轉(zhuǎn)置后的點(diǎn)乘,再通過reshape轉(zhuǎn)換為x的shape.dw是x通過reshape展開后的轉(zhuǎn)置和上層梯度dout的點(diǎn)乘,db就是上層梯度在縱軸方向上的和.
relu層前向傳播:使用np.maximum(0,x)求出x中的每個(gè)元素和0之間的最大值.
relu層后向傳播:對于大于0的輸出值,相當(dāng)于y=x,因此求導(dǎo)后就是自身.對于小于0的輸出值,相當(dāng)于y=0,因此求導(dǎo)后還是0.所以令dx=上層梯度dout,然后用dx[x<=0]=0來實(shí)現(xiàn).
全連接層+relu層是常用組合
第5章卷積神經(jīng)網(wǎng)絡(luò)
---5.1歷史
卷積神經(jīng)網(wǎng)絡(luò)就是擁有卷積層的神經(jīng)網(wǎng)絡(luò).
---5.2卷積和池化
全連接層的每一個(gè)結(jié)點(diǎn)都與上一層的所有結(jié)點(diǎn)相連.
卷積層:
可以保持空間結(jié)構(gòu)
卷積層的權(quán)重叫做卷積核(濾波器,感受野),將卷積核在圖像上滑動(dòng)并計(jì)算每一次滑動(dòng)的點(diǎn)積.滑動(dòng)的步長是可以選擇的.更大的步長意味著降采樣.
卷積核的深度一般默認(rèn)與輸入圖像相同.
實(shí)際應(yīng)用中一般會(huì)在邊角用零填充,這樣可以保持全尺寸輸出.
一般會(huì)用多個(gè)卷積核(2的次方).
滑動(dòng)卷積核會(huì)造成輸入和輸出的尺寸不同.
在卷積層后一般會(huì)跟隨一個(gè)激活層.
每幾個(gè)卷積層之間會(huì)有一個(gè)池化層.
---5.3視覺之外的卷積神經(jīng)網(wǎng)絡(luò)
池化層:
作用是使生成的表示更小且更容易控制.
池化層的步長一般設(shè)置為避免重疊,并且一般不使用零填充,因?yàn)槟康氖?strong>降采樣.
最常見的方法是最大池化:取卷積核中的最大值.濾波器一般設(shè)置為2*2.
小尺寸卷積核和棄用池化是一種趨勢.
第6章訓(xùn)練神經(jīng)網(wǎng)絡(luò)(上)
---6.1激活函數(shù)
sigmoid:
可以將數(shù)據(jù)壓縮到[0,1]范圍內(nèi).
看作神經(jīng)元的飽和放電率.
神經(jīng)元飽和(絕對值很大)時(shí),由于sigmoid函數(shù)的導(dǎo)數(shù)為0,經(jīng)過鏈?zhǔn)椒▌t后梯度也將變?yōu)?,會(huì)造成梯度消失.
由于sigmoid函數(shù)不是以0為中心的,因此它不會(huì)改變輸入值的正負(fù).這意味著梯度下降法將進(jìn)行得十分緩慢.(這也是我們要使用均值為0的數(shù)據(jù)的原因)
tanh:
數(shù)據(jù)被壓縮到[-1,1]范圍內(nèi).
以0為中心,但是當(dāng)輸入飽和時(shí)仍會(huì)出現(xiàn)梯度消失.
ReLU:
將負(fù)數(shù)變?yōu)?,正數(shù)保持不變.
不會(huì)在正的區(qū)域產(chǎn)生飽和現(xiàn)象.
計(jì)算速度快,因此收斂也很快.
比sigmoid函數(shù)更具有神經(jīng)科學(xué)的相似性.
負(fù)的區(qū)域仍會(huì)飽和,并且導(dǎo)致梯度消失.這被稱為deadReLU.因此使用時(shí)一般用較小的正偏置進(jìn)行初始化.
LeakyReLU:
與ReLU的區(qū)別是負(fù)區(qū)域有一個(gè)微小的斜率.
輸出均值接近0.
計(jì)算速度仍較快,并且不會(huì)發(fā)生飽和.
ELU(ExponentialLinearUnits):
具有ReLU的優(yōu)點(diǎn).
輸出的均值接近0.
負(fù)區(qū)域較容易飽和.
Maxout:
可以看做是ReLU和LeakyReLU的泛化.
不會(huì)飽和也不會(huì)發(fā)生梯度消失.
ReLU是較為通用的方法,LeakyReLU/Maxout/ELU可以嘗試使用,但它們更偏向于實(shí)驗(yàn)性.tanh也可以嘗試.最好不要使用sigmoid.
數(shù)據(jù)預(yù)處理是一個(gè)重要環(huán)節(jié).
零中心化(Zero-centered):
X -=np.mean(X,axis=0)
目的的使輸入數(shù)據(jù)有正有負(fù),從而避免所有梯度的正負(fù)性相同.可以加快優(yōu)化速度.
在圖像處理中較常用.可以減去整張圖像的均值圖像(AlexNet),或者只減去單通道平均值(VGGNet).
一般在訓(xùn)練集中計(jì)算出均值后,會(huì)將該均值應(yīng)用到測試數(shù)據(jù)中.
歸一化(Normalization):
X /=np.std(X,axis=0)
使得所有特征處于一個(gè)范圍內(nèi),貢獻(xiàn)相同.
在圖像處理中較少用,因?yàn)閳D像中的數(shù)值已經(jīng)有一定范圍限制.
權(quán)重初始化:
全零初始化會(huì)使所有的神經(jīng)元將做相同的事情,稱為參數(shù)對稱.
如果使用較小的隨機(jī)參數(shù)初始化,當(dāng)網(wǎng)絡(luò)較深時(shí),所有的激活值都將趨向于0.
如果使用較大的隨機(jī)參數(shù)初始化,會(huì)發(fā)生飽和.
Xavier初始化是根據(jù)輸入來得到初始化權(quán)重的一種方法.
---6.2批量歸一化
批量歸一化(BatchNormalization)也就是BN操作,目的是讓每個(gè)隱層節(jié)點(diǎn)的激活輸入分布縮小到(-1,1).
假設(shè)有N個(gè)D維訓(xùn)練樣本,我們將對每個(gè)維度獨(dú)立計(jì)算經(jīng)驗(yàn)均值和方差.
批量歸一化層通常是在全連接層或卷積層之后插入的.
計(jì)算過程:
計(jì)算小批量均值:
計(jì)算小批量方差:
歸一化:
縮放和平移因子(由學(xué)習(xí)得到):
優(yōu)點(diǎn)是縮小輸入空間,從而降低調(diào)參難度.還可以防止梯度爆炸/消失,從而加速網(wǎng)絡(luò)收斂.
在選取超參數(shù)時(shí),可以用隨機(jī)搜索或網(wǎng)格搜索.隨機(jī)搜索的優(yōu)點(diǎn)是可以對超參數(shù)空間覆蓋的更好.
第7章訓(xùn)練神經(jīng)網(wǎng)絡(luò)(下)
---7.1更好的優(yōu)化
零中心化,歸一化等數(shù)據(jù)預(yù)處理的好處是可以使分類器對參數(shù)值中的小擾動(dòng)不那么敏感.
SGD的缺陷:
如果目標(biāo)函數(shù)的梯度方向與最小值并不在一條線上,那么SGD將會(huì)呈"之"字形波動(dòng).
如果有目標(biāo)函數(shù)存在鞍點(diǎn)(局部最小點(diǎn)),SGD將卡在里面或前進(jìn)非常緩慢.
SGD有隨機(jī)性,所以噪點(diǎn)的存在會(huì)讓SGD運(yùn)行十分緩慢.
動(dòng)量(Momentum)SGD:可以解決上述問題.也就是保持一個(gè)不隨時(shí)間變化的速度,并且將梯度變化增加到這個(gè)速度上,然后在這個(gè)速度的方向上前進(jìn)而不是在梯度方向前進(jìn).每一步都用摩擦系數(shù)和梯度來更新速度.速度可以初始化為0.
Nesterovacceletaredgradient(NAG):Momentum的改進(jìn).先在原速度方向上前進(jìn)一步,計(jì)算此時(shí)的梯度后,回到原來的位置,結(jié)合這個(gè)梯度和原速度決定本次前進(jìn)的方向.
上述兩種方法對于極端極值點(diǎn)的效果可能一般,但事實(shí)是極端極值點(diǎn)意味著訓(xùn)練可能過擬合了,平滑極值點(diǎn)更具魯棒性.
AdaGrad:在訓(xùn)練時(shí)一直累積一個(gè)梯度平方項(xiàng),用步長*梯度/梯度平方項(xiàng)來前進(jìn).它的效果是加速小梯度方向的學(xué)習(xí)速度,減小大梯度方向的學(xué)習(xí)速度.并且因?yàn)?strong>梯度單調(diào)遞增,因此步長會(huì)越來越小,有利于接近極值點(diǎn),但同時(shí)會(huì)帶來鞍點(diǎn)的問題.式中的1e-7是為了除數(shù)不為0.
RMSProp:是AdaGrad的改進(jìn).仍計(jì)算梯度平方項(xiàng),但讓它按一定衰減率指數(shù)下降,可以解決AdaGrad算法學(xué)習(xí)率下降過快的問題.
Adam:可以看做是Momentum和RMSProp的結(jié)合.其中第一動(dòng)量是速度,第二動(dòng)量是梯度平方項(xiàng).如果將第二動(dòng)量初始化為0,那么一開始的步長會(huì)很大,因此需要加入偏置項(xiàng),并使用動(dòng)量的無偏估計(jì)來代替動(dòng)量.
學(xué)習(xí)率是優(yōu)化函數(shù)的一個(gè)重要超參數(shù),推薦先使用較大的學(xué)習(xí)率,然后隨著訓(xùn)練迭代逐漸減小.但是在剛建立模型時(shí)最好使用一個(gè)固定的學(xué)習(xí)率.
以上優(yōu)化算法都是一階逼近的,二階逼近的缺陷是計(jì)算量太大.可以用擬牛頓法代替牛頓法,但它們在深度學(xué)習(xí)中的使用并不多,因?yàn)椴?strong>沒有太多處理隨機(jī)的方法.
Adam(beta1=0.9,beta2=0.999,學(xué)習(xí)率=1e-3或5e-4)是首選優(yōu)化算法,但是如果問題并沒有太多隨機(jī)性,且能承受計(jì)算量的情況下(如風(fēng)格遷移),可以嘗試L-BFGS.
如果訓(xùn)練準(zhǔn)確率已經(jīng)很高,可以使用模型集成(Ensembles)來提高測試準(zhǔn)確率.一種簡單的集成方法是對不同獨(dú)立模型的結(jié)果采用投票法或平均法.也可以使用一個(gè)模型在訓(xùn)練中多個(gè)不同時(shí)期的結(jié)果來進(jìn)行集成.
---7.2正則化
正則化是一種通過防止過擬合來提高單一模型表現(xiàn)的方法.一般是在損失函數(shù)中加入正則項(xiàng)來實(shí)現(xiàn).
一般采用的正則化方法都是在訓(xùn)練時(shí)加入某種隨機(jī)性,然后在測試時(shí)抵消掉它們,由此來抑制過擬合.比如batchnormalization和dropout.
Dropout:每一次前向傳播時(shí),隨機(jī)將一部分神經(jīng)元的激活函數(shù)置0(一般將置0率設(shè)為0.5).它可以看作是避免了特征間的相互適應(yīng)來抑制過擬合,或者是單一模型的一種集成學(xué)習(xí).一個(gè)問題是dropout中存在隨機(jī)性,因此在測試時(shí)會(huì)采取乘以期望概率的形式來實(shí)現(xiàn).由此產(chǎn)生的一種稱為反轉(zhuǎn)dropout的技巧,就是指在訓(xùn)練階段將權(quán)重除以概率,這樣在測試階段就不用再乘以概率.
數(shù)據(jù)增強(qiáng)(DataAugmentation)是指在訓(xùn)練過程中以某種方式隨機(jī)地轉(zhuǎn)換圖像(翻轉(zhuǎn),裁剪,色彩抖動(dòng))來增加隨機(jī)性.
DropConnect和dropout類似,區(qū)別是它將權(quán)重矩陣的一些值置0.
部分最大池化(FractionalMaxPooling)是指在池化層中隨機(jī)池化部分區(qū)域.
隨機(jī)深度(StochasticDepth)是指在訓(xùn)練時(shí)隨機(jī)丟棄一些層,只用部分層.然后在測試時(shí)使用全部的網(wǎng)絡(luò).
大多數(shù)情況下單獨(dú)使用batchnormalization就足夠了,如果仍存在過擬合的情況,可以嘗試dropout或其他方法.
---7.3遷移學(xué)習(xí)
遷移學(xué)習(xí)(TransferLearning)是另一種抑制因?yàn)?strong>數(shù)據(jù)不夠而產(chǎn)生的過擬合的方法.
基本思想是先在大數(shù)據(jù)集上訓(xùn)練出一個(gè)神經(jīng)網(wǎng)絡(luò),然后將這個(gè)神經(jīng)網(wǎng)絡(luò)的最后一層重新在小數(shù)據(jù)集上進(jìn)行訓(xùn)練.
目前大部分的計(jì)算機(jī)視覺任務(wù)都采用在ImageNet等大數(shù)據(jù)集上進(jìn)行訓(xùn)練的預(yù)訓(xùn)練集,然后再精調(diào)網(wǎng)絡(luò)或重新初始化部分網(wǎng)絡(luò)的方式進(jìn)行.
第8章深度學(xué)習(xí)軟件
---8.1Caffe,Torch,Theano,TensorFlow,Keras,PyTorch等
CPUvsGPU:NVIDIA的GPU在深度學(xué)習(xí)中占主導(dǎo)地位.GPU有更多的核,因此更適合并行計(jì)算任務(wù),比如矩陣乘法和卷積.一般建議使用NVIDIA的CUDA和CUDNN庫來進(jìn)行運(yùn)算.
深度學(xué)習(xí)框架的優(yōu)點(diǎn):
輕松地構(gòu)建一個(gè)龐大的計(jì)算圖
輕松地計(jì)算計(jì)算圖中的梯度
在GPU上高效地運(yùn)行
tensorflow中的計(jì)算一般分為兩個(gè)階段,上半部分是定義計(jì)算圖,然后是運(yùn)行計(jì)算圖:
使用tf.placeholder()建立輸入槽用于輸入常量,tf.Variable()用于輸入變量(如權(quán)重).變量可以存在計(jì)算圖中,避免了每次都需要從內(nèi)存中讀取.變量需要聲明初始化.
建立激活函數(shù),預(yù)測值,損失函數(shù)的表達(dá)式來完善計(jì)算圖.
使用optimizer=tf.train.GradientDescentOptimizier(learning_rate)來構(gòu)建一個(gè)優(yōu)化器.
使用updates=optimizer.minimize(loss)來讓tensorflow更新梯度.(這兩步相當(dāng)于使用tf.gradients()計(jì)算反向傳播中的梯度,設(shè)定learning_rate,用assign()函數(shù)來表示權(quán)重更新的表達(dá)式.注意即使我們不需要輸出梯度,但也要在run的參數(shù)中加入梯度,否則tensorflow不會(huì)更新梯度.這里可以使用tf.group()的小技巧,將需要更新但不需要返回的值放入group中)
使用withtf.Session()assess:來建立會(huì)話.
使用sess.run(tf.global_variables_initializer())來初始化全局參數(shù).
向會(huì)話中加入常量的具體數(shù)據(jù).
使用sess.run()來運(yùn)行計(jì)算圖.
循環(huán)sess.run,即可實(shí)現(xiàn)學(xué)習(xí).
上例是tensorflow的一個(gè)非常簡單的實(shí)例.實(shí)際上可以使用多種高級(jí)庫來進(jìn)行權(quán)重初始化,激活函數(shù)的選擇等等操作.Keras就是其中一個(gè)著名的高級(jí)庫.
Tensorflow采用靜態(tài)計(jì)算圖,而PyTorch采用動(dòng)態(tài)計(jì)算圖.前者的優(yōu)勢是可以復(fù)用很多次,并且可以在磁盤中序列化.后者的優(yōu)勢是可以很方便地進(jìn)行條件選擇和循環(huán).
第9章CNN架構(gòu)
---9.1AlexNet,VGG,GoogLeNet,ResNet等
AlexNet:ImageNet比賽中第一個(gè)基于深度學(xué)習(xí)的圖像識(shí)別網(wǎng)絡(luò)框架
ZFNet:改進(jìn)了AlexNet的超參數(shù)
VGGNet:更深的網(wǎng)絡(luò)(16或19層),保持小的卷積核(3*3,多層小卷積核和單層大卷積核有一樣的感受野,但加深了網(wǎng)絡(luò)的深度,可以進(jìn)行更多非線性操作)
GoogleNet:更深的網(wǎng)絡(luò)(22層),使用inception模塊(對進(jìn)入相同層的相同輸入并行應(yīng)用不同類別的濾波操作,使用零填充保持尺寸一致,瓶頸層加速計(jì)算,然后串行輸出它們),沒有全連接層.
ResNet:152層的殘差網(wǎng)絡(luò).普通網(wǎng)絡(luò)可能出現(xiàn)網(wǎng)絡(luò)更深表現(xiàn)卻更差的情況,因?yàn)樯顚泳W(wǎng)絡(luò)更難優(yōu)化.ResNet的解決方案是讓每層都學(xué)習(xí)一些所需函數(shù)的底層映射,并嘗試擬合殘差映射.同樣會(huì)使用瓶頸層來加速運(yùn)算.
第10章循環(huán)神經(jīng)網(wǎng)絡(luò)
---10.1RNN,LSTM,GRU
相比CNN的輸入有著固定的尺寸,RNN可以實(shí)現(xiàn)一對多,多對一,多對多的模型,輸入和輸出都可以是可變長度.
每個(gè)RNN網(wǎng)絡(luò)都有一個(gè)循環(huán)核心單元,它把x作為輸入傳入RNN的內(nèi)部隱藏態(tài)(internalhiddenstate),它在每次讀取新的輸入時(shí)更新,然后將結(jié)果反饋至模型.
多對多的RNN一般在每個(gè)時(shí)間步都將進(jìn)行輸出.注意這里的權(quán)重矩陣是不變的,最終的梯度和損失是所有時(shí)間步下計(jì)算出的梯度之和以及損失之和.
多對一的RNN會(huì)根據(jù)最終的隱層狀態(tài)做出決策.
一對多的RNN則接收固定長的輸入項(xiàng),然后輸出不定長的輸出項(xiàng).
機(jī)器翻譯之類的任務(wù)則需要一個(gè)多對一的RNN x加上一個(gè)一對多的RNN,類似編碼器與解碼器.
---10.2語言模型
單詞一般用獨(dú)熱編碼向量表示.針對字符級(jí)的語言模型,我們可以用不同的單詞去訓(xùn)練一個(gè)RNN網(wǎng)絡(luò),這樣它將會(huì)學(xué)習(xí)到一個(gè)字符之后最可能出現(xiàn)地其他字符是什么.
沿時(shí)間的截?cái)喾聪騻鞑?/strong>是指前向計(jì)算若干步子序列的損失值,然后沿著這個(gè)子序列反向傳播,并計(jì)算梯度更新參數(shù).
---10.3圖像標(biāo)注,視覺問答,Softattention模型
圖像標(biāo)注(ImageCaptioning)輸入一個(gè)圖像,輸出自然語言的圖像語義信息.它是由CNN和RNN組合而成的.COCO是最大的圖像標(biāo)注數(shù)據(jù)集.
注意力模型是指在生成與圖像對應(yīng)的文字時(shí),可以允許模型將注意力放到圖像的不同部分.也就是CNN在圖像中每一個(gè)特殊的地方都用一個(gè)向量表示,當(dāng)模型向前傳遞時(shí)會(huì)產(chǎn)生一個(gè)分布,對應(yīng)圖像的不同位置.
視覺問答(VisualQuestionAnswering)輸入一張圖像和一段自然語言的提問(一般直接將圖像向量和問題向量連接起來),輸出一些自然語言的答案.它同樣是由CNN和RNN連接而成的.
一般RNN在反向傳播時(shí)會(huì)不斷乘以相同的權(quán)重矩陣,因此容易發(fā)生梯度爆炸或梯度消失.
梯度截?cái)?/strong>是防止梯度爆炸的一種方法:如果梯度的L2范式大于某個(gè)閾值,就將梯度乘上閾值除以梯度的L2范式來減小梯度.
防止梯度消失的一種辦法是換一種RNN結(jié)構(gòu).
LSTM(長短期記憶網(wǎng)絡(luò))被設(shè)計(jì)用來緩解梯度消失和梯度爆炸問題.
每個(gè)時(shí)間步中都維持兩個(gè)隱藏狀態(tài),一個(gè)是類似RNN中的隱藏狀態(tài)(ht),一個(gè)是單元狀態(tài)(ct).
將上一時(shí)間步的隱藏狀態(tài)和當(dāng)前的輸入堆疊在一起,乘上一個(gè)權(quán)重矩陣w,得到四個(gè)不同的門向量ifog(inputgate表示要接受多少新的輸入信息,forgetgate表示要遺忘多少之前的單元記憶,outputgate表示要展現(xiàn)多少信息給外部,gategate表示有多少信息要寫到輸入單元中).ifo門都使用sigmoid激活函數(shù),含義是0丟棄全部,1接受全部.而g門使用tanh激活函數(shù),含義是單元狀態(tài)最多自增或自減1.
更新隱藏狀態(tài)和單元狀態(tài).
LSTM反向傳播的優(yōu)點(diǎn)在于f門進(jìn)行的是矩陣元素相乘,而且每個(gè)f門都不同,因此不容易發(fā)生梯度爆炸或消失.這是一種利用加法連接和乘法門來管理梯度流的概念.
GRU(門控循環(huán)單元)也是一種類似LSTM的結(jié)構(gòu).
第11章圖像識(shí)別和分割
---11.1分割
語義分割(SemanticSegmentation)是指輸入圖像,并對圖像中的每個(gè)像素進(jìn)行分類.語義分割并不區(qū)分同類目標(biāo).
滑動(dòng)窗口是一種方案,但復(fù)雜度太高,一般不使用.
全連接卷積網(wǎng)絡(luò)和補(bǔ)零法(使圖像尺寸不會(huì)被改變)是另一種方案,但是需要的層數(shù)太多.
一般會(huì)在前半部分使用卷積結(jié)合下采樣(池化或跨卷積),然后在后半部分使用上采樣(去池化,轉(zhuǎn)置卷積,一般和池化過程對稱)來恢復(fù)圖像的清晰度.
---11.2定位
定位(ClassificationplusLocalization)是指預(yù)測分類,并找到一個(gè)邊界包裹該物體.
一般用卷積網(wǎng)絡(luò)處理輸入圖像,得到一些向量,并由這些向量得到分類概率.同時(shí)有另一個(gè)全連接層從這些向量輸出四個(gè)數(shù)字,代表邊界框坐標(biāo).有兩組損失函數(shù),一組用softmax計(jì)算分類得分,另一種計(jì)算預(yù)測坐標(biāo)的準(zhǔn)確率(如L1損失,L2損失),因此需要對它們加權(quán)求和來做反向傳播.
一種技巧是凍結(jié)網(wǎng)絡(luò),分開訓(xùn)練這兩個(gè)網(wǎng)絡(luò)直到收斂,然后再調(diào)試整個(gè)系統(tǒng).
這種網(wǎng)絡(luò)同樣可以用于姿態(tài)估計(jì)(HumanPoseEstimation).例如用14個(gè)關(guān)節(jié)點(diǎn)來定義人的姿態(tài),網(wǎng)絡(luò)將輸出14個(gè)坐標(biāo).
---11.3識(shí)別
對象識(shí)別(ObjectDetection)是指根據(jù)輸入的圖像確認(rèn)分類,并標(biāo)注邊界框.它與定位的區(qū)別是輸入圖像中物體的個(gè)數(shù)是不確定的,因此需要預(yù)測的參數(shù)數(shù)量也不確定.
滑動(dòng)窗口(SlidingWindow)將輸入對象切分為小塊,然后將它輸入到卷積網(wǎng)絡(luò)中,輸入對應(yīng)分類結(jié)果(如果沒有分類目標(biāo),則屬于背景).它的缺陷是窗口的大小和位置難以抉擇.
R-CNN采用信號(hào)處理,圖像處理等方法來建立候選清單,然后將圖像切分為上千個(gè)候選區(qū)域(RegionProposals),再對這些區(qū)域應(yīng)用卷積網(wǎng)絡(luò).候選區(qū)域可能有不同的尺寸,因此在傳入網(wǎng)絡(luò)前需要將它們切分至固定尺寸.最后使用SVM分類,同時(shí)有一個(gè)用于預(yù)測邊界的補(bǔ)償值,所以這是一個(gè)多任務(wù)損失.它的缺陷是仍需要傳入大量候選區(qū)域,并且這些候選區(qū)域是由固定算法得到的,無法學(xué)習(xí)參數(shù).
FastR-CNN通過卷積網(wǎng)絡(luò)得到圖像的高分辨率特征映射,切分圖像的像素,基于備選區(qū)域投影到卷積特征映射,從中提取屬于備選區(qū)域的卷積塊.然后用興趣區(qū)域池化層(ROIpoolinglayer)來使卷積塊變?yōu)?strong>固定尺寸,輸入全連接層進(jìn)行分類.同樣有一個(gè)多任務(wù)損失,需要基于全局反向傳播同時(shí)學(xué)習(xí).它可以重復(fù)運(yùn)用卷積計(jì)算,因此時(shí)間主要消耗在尋找備選區(qū)域.
FasterR-CNN讓卷積網(wǎng)絡(luò)去預(yù)測備選區(qū)域,其余與FastR-CNN相同.神經(jīng)網(wǎng)絡(luò)同時(shí)處理四件事:
備選區(qū)域是否是待識(shí)別物體
校正包圍盒
最終物體識(shí)別的損失
最終包圍盒補(bǔ)償?shù)膿p失
YOLO(YouOnlyLookOnce)和SSD(SingleShotDetection)這類模型的思想是利用大型卷積網(wǎng)絡(luò)當(dāng)成回歸問題處理.將輸入圖像分為網(wǎng)格,每個(gè)網(wǎng)格都有一系列的基本邊界框.對每個(gè)網(wǎng)格和每個(gè)基本邊界框預(yù)測邊界框偏移和目標(biāo)對應(yīng)類別的分?jǐn)?shù).
物體分割(InstanceSegmentation)是給定一張輸入圖像,預(yù)測出圖像中每個(gè)物體的具體像素.
MaskR-CNN將整張輸入圖像送入卷積網(wǎng)絡(luò)和訓(xùn)練好的候選框生成網(wǎng)絡(luò),然后將候選框投射到卷積特征圖上,然后產(chǎn)生兩個(gè)分支,一個(gè)預(yù)測出分類類別分?jǐn)?shù)和邊界框的坐標(biāo),另一個(gè)是一個(gè)語義分割的微型網(wǎng)絡(luò).
第12章可視化和理解卷積神經(jīng)網(wǎng)絡(luò)
---12.1特征可視化,倒置,對抗樣本
對第一層卷積層可視化,得到的特征圖像一般是不同顏色,不同角度的有向邊.但是對較深的卷積層可視化得到的圖像則沒有明顯含義.
降維(如t-SNE,PCA)可以將高維特征映射為二維圖像.
排除實(shí)驗(yàn)用平均像素遮擋圖像中的一部分,然后觀察圖像分類概率的變化值,得到概率熱力圖.由此可以判斷圖像中的哪些部分對分類起關(guān)鍵作用.
顯著圖(SaliencyMap)對每個(gè)像素做輕微擾動(dòng),然后計(jì)算像素對分類預(yù)測概率的影響,從而得到哪些像素是影響分類的關(guān)鍵部分.
梯度上升(GradientAscent)修正訓(xùn)練的神經(jīng)網(wǎng)絡(luò)的權(quán)重,并改變圖像的某些像素,來最大化某些中間神經(jīng)元和類的分值.為了讓生成圖像符合自然圖像,需要加入正則項(xiàng)(圖像的L2范數(shù),高斯模糊處理).
---12.2DeepDream和風(fēng)格遷移
提取輸入圖像,通過神經(jīng)網(wǎng)絡(luò)運(yùn)行到某一層,使得該層的梯度等于激活值,然后反向傳播到圖像.這樣就放大了神經(jīng)網(wǎng)絡(luò)在圖像中檢測到的特征.
特征反演(FeatureInversion)通過神經(jīng)網(wǎng)絡(luò)運(yùn)行一張圖像,記錄其中一個(gè)特征值,然后根據(jù)它的特征表示重構(gòu)該圖像.
紋理合成(TextureSynthesis)給定一些紋理的輸入圖像塊,輸出更大塊的紋理圖像.神經(jīng)網(wǎng)絡(luò)的紋理合成方法是將紋理輸入神經(jīng)網(wǎng)絡(luò),輸出一個(gè)H*W的C維特征.然后選取輸入特征的兩個(gè)不同列得到C*C的矩陣,反映了哪些特征傾向于在空間的不同位置一起激活.
風(fēng)格遷移(NeuralStyleTransfer)選用藝術(shù)畫作進(jìn)行紋理合成,再使用特征反演生成具有藝術(shù)風(fēng)格的圖像.
第13章生成模型
---13.1 Pixel RNN/CNN
生成模型是指在給定訓(xùn)練數(shù)據(jù)下從相同的數(shù)據(jù)分布中生成新的樣本.它可以解決密度估計(jì)問題.
PixleRNN/CNN屬于全可見信念網(wǎng)絡(luò).它對一個(gè)密度分布顯式建模.使用鏈?zhǔn)椒▌t來將似然分解為一維分布的乘積,然后只要在該定義下最大化訓(xùn)練數(shù)據(jù)的似然即可訓(xùn)練模型.
用神經(jīng)網(wǎng)絡(luò)來表達(dá)概率分布函數(shù)p(xi),其中xi的順序由像素?cái)U(kuò)散的順序決定,并傳入LSTM/CNN中.訓(xùn)練圖片的每個(gè)像素值可以充當(dāng)訓(xùn)練標(biāo)簽,所以可以使用softmax函數(shù)進(jìn)行訓(xùn)練.
---13.2變分自編碼器
自動(dòng)編碼器(Autoencoders)是一種無監(jiān)督學(xué)習(xí)方法,將輸入數(shù)據(jù)通過編碼器生成一些特征.編碼器的映射函數(shù)一般是ReLU+CNN.生成的特征一般比輸入數(shù)據(jù)的維度小,所以這是一種生成重要特征的降維方法.利用生成的特征和解碼器(解卷積網(wǎng)絡(luò))輸出與輸入數(shù)據(jù)維度相同的數(shù)據(jù),并利用L2損失函數(shù)來計(jì)算原數(shù)據(jù)和生成數(shù)據(jù)之間的誤差.訓(xùn)練好模型后去掉解碼器,就可以有一個(gè)用于生成重要特征的模型.
變分自編碼器定義一個(gè)不易處理的密度函數(shù),通過附加的隱變量z對其建模.它通過向自動(dòng)編碼器中加入隨機(jī)因子從而生成新數(shù)據(jù),自動(dòng)編碼器生成的特征就是隱變量z.首先選一個(gè)簡單的關(guān)于z的先驗(yàn)分布,然后用神經(jīng)網(wǎng)絡(luò)計(jì)算條件概率p(x|z),并用解碼器生成圖像.直接計(jì)算數(shù)據(jù)的最大似然很難,所以使用一個(gè)額外的編碼器來給出條件概率.
---13.3生成式對抗網(wǎng)絡(luò)
生成式對抗網(wǎng)絡(luò)(Generative Adversarial Networks)采用博弈論的方法,從一個(gè)簡單分布中采樣(如隨機(jī)噪聲),然后用神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)從簡單分布到想要的分布的一個(gè)變換.
把訓(xùn)練過程看作兩個(gè)玩家博弈的過程,生成器網(wǎng)絡(luò)試圖生成圖像來騙過判別器網(wǎng)絡(luò),判別器網(wǎng)絡(luò)試圖把真假圖片區(qū)分開來.
優(yōu)化目標(biāo)是使判別器的目標(biāo)函數(shù)盡可能大,生成器的目標(biāo)函數(shù)盡可能小.首先對判別器進(jìn)行梯度上升,從而學(xué)習(xí)thetad來最大化.接著對生成器進(jìn)行梯度下降,從而學(xué)習(xí)thetag來最小化.但這種方法的生成器目標(biāo)函數(shù)效果不好,因?yàn)樗奶荻群妥陨硇Ч烧?所以一開始訓(xùn)練會(huì)很困難.因此采用相反的想法,轉(zhuǎn)而用梯度上升最大化生成器網(wǎng)絡(luò)的目標(biāo)函數(shù)的相反值,訓(xùn)練過程將交替進(jìn)行.
第14章深度增強(qiáng)學(xué)習(xí)
---14.1策略梯度,硬注意
強(qiáng)化學(xué)習(xí)(ReinforcementLearning)有一個(gè)代理和一個(gè)環(huán)境,環(huán)境賦予代理一個(gè)狀態(tài),代理將采取行動(dòng),環(huán)境將回饋一個(gè)獎(jiǎng)勵(lì).這一過程將一直進(jìn)行下去,直到環(huán)境給出終端狀態(tài).這可以作用于游戲或棋類AI.
馬爾可夫決策過程(MarkovDecisionProcess)是強(qiáng)化學(xué)習(xí)問題的數(shù)學(xué)表達(dá).它滿足馬爾可夫性:當(dāng)前狀態(tài)完全刻畫了世界的狀態(tài).它由S(所有可能狀態(tài)的集合),A(所有行動(dòng)的集合),R(獎(jiǎng)勵(lì)的分布函數(shù)),P(下一個(gè)狀態(tài)的轉(zhuǎn)移概率分布)和γ(獎(jiǎng)勵(lì)因子)定義.它的工作方式是令初始時(shí)間步t=0,環(huán)境從初始狀態(tài)分布p(s)中采樣,并將一些初始狀態(tài)設(shè)為0,然后開始以下循環(huán):
代理選擇一個(gè)動(dòng)作.
環(huán)境從該狀態(tài)和動(dòng)作獲得獎(jiǎng)勵(lì).
抽樣下一個(gè)狀態(tài).
代理收到獎(jiǎng)勵(lì),進(jìn)入下一狀態(tài).
基于上述循環(huán),目標(biāo)就是找到一個(gè)最佳策略(指定了每個(gè)狀態(tài)下要采取的行動(dòng)),使得獎(jiǎng)勵(lì)之和最大.因?yàn)镸DP中含有隨機(jī)性,所以要最大化預(yù)期獎(jiǎng)勵(lì)之和.
任何狀態(tài)下的價(jià)值函數(shù)(Valuefunction)都是從狀態(tài)s的決策到現(xiàn)在的決策之后的期望累積獎(jiǎng)勵(lì).任何狀態(tài)行動(dòng)組的Q值函數(shù)(Q-valuefunction)遵守在狀態(tài)s下采取行動(dòng)a的期望累積獎(jiǎng)勵(lì).
Bellman等式意味著給定任何狀態(tài)動(dòng)作組s和a,這一對的價(jià)值就是回饋r加上最終進(jìn)入的任何狀態(tài)動(dòng)作組s'和a'的價(jià)值.它的問題在于必須計(jì)算每一個(gè)狀態(tài)動(dòng)作組,這是一個(gè)巨大的狀態(tài)空間,因此不可行.
---14.2Q-Learning,Actor-Critic算法
使用深度神經(jīng)網(wǎng)絡(luò)來估計(jì)動(dòng)作值函數(shù),這稱作深度強(qiáng)化學(xué)習(xí).
決策梯度是指對策略參數(shù)進(jìn)行梯度評(píng)估.
將深度強(qiáng)化學(xué)習(xí)和決策梯度結(jié)合,就得到了Actor-Critic算法.
第15章深度學(xué)習(xí)的方法及硬件
第16章對抗樣本和對抗訓(xùn)練
總結(jié)
以上是生活随笔為你收集整理的CS231n 斯坦福深度视觉识别课 学习笔记(完结)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 久别重逢的意思(久别重逢的句子友谊)
- 下一篇: APP开发,微信第三方登录的介绍