DnCnn

圖像去噪的背景

參考:https://blog.csdn.net/weixin_40446557/article/details/81451651

一、什麼是圖像噪聲?

噪聲在圖像上常表現爲一引起較強視覺效果的孤立像素點或像素塊。一般,噪聲信號與要研究的對象不相關,它以無用的信息形式出現,擾亂圖像的可觀測信息。通俗的說就是噪聲讓圖像不清楚。

在圖像的採集、傳輸和量化編碼解碼的過程中,會產生噪聲,常見的噪聲有高斯噪聲、泊松噪聲、和椒鹽噪聲。

高斯噪聲是指它的概率密度函數服從高斯分佈(即正態分佈)的一類噪聲。如果一個噪聲,它的幅度分佈服從高斯分佈,而它的功率譜密度又是均勻分佈的,則稱它爲高斯白噪聲。高斯白噪聲的二階矩不相關,一階矩爲常數,是指先後信號在時間上的相關性。

產生原因:

1)圖像傳感器在拍攝時市場不夠明亮、亮度不夠均勻;

2)電路各元器件自身噪聲和相互影響;

3)圖像傳感器長期工作,溫度過高。

泊松噪聲就是符合泊松分佈的噪聲模型,泊松分佈適合於描述單位時間內隨機事件發生的次數的概率分佈。如某一服務設施在一定時間內受到的服務請求的次數,電話交換機接到呼叫的次數、汽車站臺的候客人數、機器出現的故障數、自然災害發生的次數、DNA序列的變異數、放射性原子核的衰變數等等。

泊松噪聲一般在亮度很小或者高倍電子放大線路中出現

椒鹽噪聲,椒鹽噪聲又稱脈衝噪聲,它隨機改變一些像素值,是由圖像傳感器,傳輸信道,解碼處理等產生的黑白相間的亮暗點噪聲。

椒鹽噪聲往往由圖像切割引起。

實現:skimage庫 skimage.util.random_noise(imagemode=’gaussian’seed=Noneclip=True**kwargs)

其中image (height, weight,channel)

————————————————————————————————————————————————————————

評價指標:

PSNR (Peak Signal-to-Noise Ratio) 峯值信噪比

 

VGG網絡:

VGG16相比AlexNet的一個改進是採用連續的幾個3x3的卷積核代替AlexNet中的較大卷積核(11x11,7x7,5x5),也就是說VGGNet探索了卷積神經網絡的深度與其性能之間的關係,通過反覆的使用3x3的小型卷積核和2x2的最大池化層,VGGNet成功地構築了16~19層深的卷積神經網絡。

VGG16網絡的好處

接觸過深度學習的應該都知道最早的卷積神經網絡都是通過比較大的卷積核進行卷積來提取特徵的(例如AlexNet,LeNet),雖然卷積核的尺寸越大,越能夠總結空間信息。但是同樣也增加了參數的數量,提高了計算量。而VGG網絡通過每個block中多個3x3 的卷積核來代替之前的大尺寸卷積核,可以說是非常的nice!舉個例子,用3個3x3的卷積核來卷積得到像素對應的感受野大小與一個7x7卷積核得到的感受野大小是一樣的。但是,參數量卻是差了近一倍(3x3x3=27,7x7=49)

5x5卷積核可以用2個3x3卷積核替代的原因,好處降低參數量

(1)保證具有相同感知野的條件下,提升了網絡的深度,在一定程度上提升了神經網絡的效果;(2)減少計算參數量


VGGNet的優缺點總結:

  • VGGNet的結構非常簡潔,整個網絡都使用了同樣大小的卷積核尺寸(3x3)和最大池化尺寸(2x2),每個block中通過多個Conv的操作,即減少了參數量還保留了同樣的感受野。

  • 驗證了通過不斷加深網絡結構可以提升性能通過網絡結構的加深,網絡能夠提取更加抽象的高階特徵,這也就是爲什麼最後提取了512通道的feature map。

  • 缺點:它的參數量太大,耗費了很多的計算資源,這主要是因爲最後的三個全連接層。而後也提出了Inception v1、v2、v3版本以及FCN。

爲什麼網絡的深度可以影響網絡的性能?

  • 非線性表達能力更強,可以獲取更多抽象的特徵,能夠解決更加複雜的問題
  • 每一層的工作量會減小

卷積

卷積的三種模式:full, same, valid;full爲從filter和image剛相交開始做卷積,same是保持卷積後的和原來一樣,valid是卷積後的變小。(n + 2*p - f)/s + 1  new size 卷積的三種模式

卷積操作:一個濾波器大小映射成一個像素點。

感受野:其實就是指一個像素點和之前的多少個像素有關聯。

卷積的優勢:參數共享和稀疏連接【有防止過擬合的功效】

參數共享:(卷積核)濾波器的參數是共享的

即低階/高階特徵。這是隨着卷積網絡的加深對不同深度的feature map的取名。低階特徵可以理解爲顏色、邊緣等特徵,就好比是一個圖片中車的輪廓。 高階特徵可以理解爲是更加抽象的特徵,相當於更加細化的,比如說車中車輪,以及車輪中的車胎等。而通過卷積網絡深度的增加,提取到的最後的高階特徵就是組成元素的基本組成單位:比如點、線、弧等。而最後的全連接層的目的其實就是進行這些高階特徵的特徵組合

池化

池化操作主要包含最大池化和平均池化:
最大池化:其實就是降低維度,提取圖像的主要特徵。
平均池化:取一個區域的平均值,用來保留圖像的背景信息。

池化的優點:池化層的降採樣,進一步降低了輸出的參數量,並賦予模型以輕度形變的容忍性,提高了模型的泛化能力。

全連接

把之前提取的所有特徵重新組合起來。

參考博客如下:

https://blog.csdn.net/qq_19329785/article/details/84504722?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

https://blog.csdn.net/amusi1994/article/details/81461968?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

https://www.jianshu.com/p/72481d794a6b

https://blog.csdn.net/bemy1008/article/details/84559905

——————————————————————————————————————————————————————————

批量歸一化Batch Normalization

參考博客:https://www.cnblogs.com/guoyaohua/p/8724433.html

  1. 整體說一下:機器學習領域有個很重要的假設:IID獨立同分布假設,就是假設訓練數據和測試數據是滿足相同分佈的,這是通過訓練數據獲得的模型能夠在測試集獲得好的效果的一個基本保障。那BatchNorm的作用是什麼呢?BatchNorm就是在深度神經網絡訓練過程中使得每一層神經網絡的輸入保持相同分佈的。
  2. 接着引入covariate shift的概念如果ML系統實例集合<X,Y>中的輸入值X的分佈老是變,這不符合IID假設,網絡模型很難穩定的學規律,這不得引入遷移學習才能搞定嗎,我們的ML系統還得去學習怎麼迎合這種分佈變化啊。對於深度學習這種包含很多隱層的網絡結構,在訓練過程中,因爲各層參數不停在變化,所以每個隱層都會面臨covariate shift的問題,也就是在訓練過程中,隱層的輸入分佈老是變來變去,這就是所謂的“Internal Covariate Shift”,Internal指的是深層網絡的隱層,是發生在網絡內部的事情,而不是covariate shift問題只發生在輸入層。
  3. BN的基本思想其實相當直觀:因爲深層神經網絡在做非線性變換前的激活輸入值(就是那個x=WU+B,U是輸入)隨着網絡深度加深或者在訓練過程中,其分佈逐漸發生偏移或者變動,之所以訓練收斂慢,一般是整體分佈逐漸往非線性函數的取值區間的上下限兩端靠近(對於Sigmoid函數來說,意味着激活輸入值WU+B是大的負值或正值),所以這導致反向傳播時低層神經網絡的梯度消失,這是訓練深層神經網絡收斂越來越慢的本質原因而BN就是通過一定的規範化手段,把每層神經網絡任意神經元這個輸入值的分佈強行拉回到均值爲0方差爲1的標準正態分佈,其實就是把越來越偏的分佈強制拉回比較標準的分佈,這樣使得激活輸入值落在非線性函數對輸入比較敏感的區域,這樣輸入的小變化就會導致損失函數較大的變化,意思是這樣讓梯度變大,避免梯度消失問題產生,而且梯度變大意味着學習收斂速度快,能大大加快訓練速度。其實一句話就是:對於每個隱層神經元,把逐漸向非線性函數映射後向取值區間極限飽和區靠攏的輸入分佈強制拉回到均值爲0方差爲1的比較標準的正態分佈,使得非線性變換函數的輸入值落入對輸入比較敏感的區域,以此避免梯度消失問題。
    所以BN爲了保證非線性的獲得,對變換後的滿足均值爲0方差爲1的x又進行了scale加上shift操作(y=scale*x+shift)。核心思想應該是想找到一個線性和非線性的較好平衡點,既能享受非線性的較強表達能力的好處,又避免太靠非線性區兩頭使得網絡收斂速度太慢。
  4. BN優點:不僅僅極大提升了訓練速度,收斂過程大大加快;②還能增加分類效果,一種解釋是這是類似於Dropout的一種防止過擬合的正則化表達方式,所以不用Dropout也能達到相當的效果;③另外調參過程也簡單多了,對於初始化要求沒那麼高,而且可以使用大的學習率等。

——————————————————————————————————————————————————————————

殘差學習Residual learning

Dncnn中的殘差學習:與使用許多殘差單元的殘差網絡[29]不同,我們的DnCNN使用單個殘差單元來預測殘差圖像。乾淨圖片爲x,噪聲爲v,那麼加噪圖像是y = x + v。殘差學習不是讓網絡直接根據y預測出乾淨圖像x,二是讓殘差單元R(y)預測v,那麼幹淨圖像就是y - R(y).

不同的是DnCNN並非每隔兩層就加一個shortcut connection,而是將網絡的輸出直接改成residual image(殘差圖片),設純淨圖片爲x,帶噪音圖片爲y,假設y=x+v,則v是殘差圖片。即DnCNN的優化目標不是真實圖片與網絡輸出之間的MSE(均方誤差),而是真實殘差圖片與網絡輸出之間的MSE。

根據ResNet中的理論,當殘差爲0時,堆積層之間等價於恆等映射,而恆等映射是非常容易訓練優化的。作者注意到在圖像復原領域(尤其是在噪音程度較小的情況下),噪音圖片與純淨圖片的殘差非常小,所以理論上殘差學習非常適合運用到圖像復原上。

 

而我們常說的殘差網絡是怎麼回事呢?

ResNet:

原文鏈接:https://blog.csdn.net/weixin_43624538/article/details/85049699

1、網絡性能退化

網絡的深度造成的問題:

  • 增加深度帶來的首個問題就是梯度爆炸/消散的問題,這是由於隨着層數的增多,在網絡中反向傳播的梯度會隨着連乘變得不穩定,變得特別大或者特別小。這其中經常出現的是梯度消散的問題。
  • 爲了克服梯度消散也想出了許多的解決辦法,如使用BN,relu激活函數使用Xaiver初始化等,可以說梯度消散已經得到了很好的解決
  • 增加深度的另一個問題就是網絡的degradation問題,即隨着深度的增加,網絡的性能會越來越差,直接體現爲在訓練集上的準確率會下降,殘差網絡文章解決的就是這個問題,而且在這個問題解決之後,網絡的深度上升了好幾個量級。

2、殘差網絡原理

隨着網絡深度的增加,網絡的性能由好變差,我們可以設想一下,當我們直接對網絡進行簡單的堆疊到特別長,網絡內部的特徵在其中某一層已經達到了最佳的情況,至少讓深度網絡實現和淺層網絡一樣的性能,即讓深度網絡後面的層至少實現恆等映射的作用,根據這個想法,作者提出了殘差模塊來幫助網絡實現恆等映射

F(x)=H(x)−xx爲淺層的輸出,H(x)爲深層的輸出,F(x)爲夾在二者中間的的兩層代表的變換,當淺層的x代表的特徵已經足夠成熟,如果任何對於特徵x的改變都會讓loss變大的話,F(x)會自動趨向於學習成爲0,x則從恆等映射的路徑繼續傳遞。這樣就在不增加計算成本的情況下實現了一開始的目的:在前向過程中,當淺層的輸出已經足夠成熟(optimal),讓深層網絡後面的層能夠實現恆等映射的作用。

3、殘差網絡的優勢

可以訓練更深層的網絡。

————————————————————————————————————————————————————————————

數據增強方法

1、常用的數據增強方法

參考博客:https://blog.csdn.net/zhelong3205/article/details/81810743?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2

爲什麼需要數據增強 :

一般而言,比較成功的神經網絡需要大量的參數,許許多多的神經網路的參數都是數以百萬計,而使得這些參數可以正確工作則需要大量的數據進行訓練,而實際情況中數據並沒有我們想象中的那麼多

數據增強的作用 :

增加訓練的數據量,提高模型的泛化能力
增加噪聲數據,提升模型的魯棒性

如何獲得大量的數據 :

一種方法是獲得新的數據,這種方法比較麻煩,需要大量的成本,而第二種方法則是對數據進行增強,即利用已有的數據比如翻轉、平移或旋轉,創造出更多的數據,來使得神經網絡具有更好的泛化效果。

數據增強的分類 :

數據增強可以分爲兩類,一類是離線增強,一類是在線增強。

離線增強 : 直接對數據集進行處理,數據的數目會變成增強因子 x 原數據集的數目 ,這種方法常常用於數據集很小的時候
在線增強 : 這種增強的方法用於,獲得 batch 數據之後,然後對這個 batch 的數據進行增強,如旋轉、平移、翻折等相應的變化,由於有些數據集不能接受線性級別的增長,這種方法長用於大的數據集,很多機器學習框架已經支持了這種數據增強方式,並且可以使用 GPU 優化計算。


常用的數據增強技術 :

首先定義增強因子 : 指的是數據做離線增強之後增長的倍數。

翻轉 :增強因子 2 或 3 
數據翻轉是一種常用的數據增強方法,這種方法不同於旋轉 180 這種方法是做一種類似於鏡面的翻折。 
旋轉 : 增強因子 2 到 4 
旋轉就是順時針或者逆時針的旋轉,注意在旋轉的時候, 最好旋轉 90 - 180 度否則會出現尺度的問題 
縮放 :增強因子任意 
圖像可以被放大或縮小。放大時,放大後的圖像尺寸會大於原始尺寸。大多數圖像處理架構會按照原始尺寸對放大後的圖像 進行裁切。我們將在下一章節討論圖像縮小,因爲圖像縮小會減小圖像尺寸,這使我們不得不對圖像邊界之外的東西做出假設。下面是圖像縮放的例子。 
裁剪 :增強因子任意 
這種方法更流行的叫法是隨機裁剪,我們隨機從圖像中選擇一部分,然後降這部分圖像裁剪出來,然後調整爲原圖像的大小 
平移 : 增強因子任意 
平移是將圖像沿着 x 或者 y 方向 (或者兩個方向) 移動。我們在平移的時候需對背景進行假設,比如說假設爲黑色等等,因爲平移的時候有一部分圖像是空的,由於圖片中的物體可能出現在任意的位置,所以說平移增強方法十分有用。 
添加噪聲 :增強因子任意 看噪聲的類型 
過擬合通常發生在神經網絡學習高頻特徵的時候 (因爲低頻特徵神經網絡很容易就可以學到,而高頻特徵只有在最後的時候纔可以學到) 而這些特徵對於神經網絡所做的任務可能沒有幫助,而且會對低頻特徵產生影響,爲了消除高頻特徵我們隨機加入噪聲數據來消除這些特徵。 

Dncnn中用到的數據增強

首先對BSD400數據集【400*180*180】進行【1,0.9,0.8,0.7】四種程度的縮放處理,然後分成40*40的圖像塊patch,每隔10像素裁剪,大約裁剪14*14*400*4接近20w的圖像塊,每個圖像塊再隨機進行 原圖,翻轉,旋轉 的處理,使用np.save保存圖像,文件後綴爲npy.

——————————————————————————————————————————————————————


https://blog.csdn.net/sinat_35512245/article/details/78796328?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

https://blog.csdn.net/woaidapaopao/article/details/77806273

激活函數

1、梯度消失、梯度爆炸 
  梯度消失:這本質上是由於激活函數的選擇導致的, 最簡單的sigmoid函數爲例,在函數的兩端梯度求導結果非常小(飽和區),導致後向傳播過程中由於多次用到激活函數的導數值使得整體的乘積梯度結果變得越來越小,也就出現了梯度消失的現象。 
  梯度爆炸:同理,出現在激活函數處在激活區,而且權重W過大的情況下。但是梯度爆炸不如梯度消失出現的機會多。

2.如何解決梯度消失和梯度膨脹?

(1)梯度消失: 
  根據鏈式法則,如果每一層神經元對上一層的輸出的偏導乘上權重結果都小於1的話,那麼即使這個結果是0.99,在經過足夠多層傳播之後,誤差對輸入層的偏導會趨於0,可以採用ReLU激活函數有效的解決梯度消失的情況。 
(2)梯度膨脹 
  根據鏈式法則,如果每一層神經元對上一層的輸出的偏導乘上權重結果都大於1的話,在經過足夠多層傳播之後,誤差對輸入層的偏導會趨於無窮大,可以通過激活函數來解決。
 

常見的激活函數表達式,及優缺點
Sigmoid    σ(x)=1/(1+e−x)   

  • 1、會有梯度彌散
  • 2、不是關於原點對稱
  • 3、計算exp比較耗時    -

Tanh    tanh(x)=2σ(2x)−1 

缺點:梯度彌散沒解決  

優點:

  •  1、解決了原點對稱問題
  • 2、比sigmoid更快

ReLU    f(x)=max(0,x)

缺點:梯度彌散沒完全解決,在(-)部分相當於神經元死亡而且不會復活 

優點:

1、解決了部分梯度彌散問題
2、收斂速度更快

疑問:爲什麼relu是線性分段函數,但是確是非線性函數。線性非線性是作用在定義域上的,在定義域上如果一階倒數不是常數就是非線性函數。x>=0時導數爲1, x<0時倒數爲0。

————————————————
原文鏈接:https://blog.csdn.net/woaidapaopao/article/details/77806273

常用的非線性激活函數有sigmoid、tanh、relu等等,前兩者sigmoid/tanh比較常見於全連接層,後者relu常見於卷積層。這裏先簡要介紹下最基礎的sigmoid函數(btw,在本博客中SVM那篇文章開頭有提過)。

Sigmoid的函數表達式如下:

也就是說,Sigmoid函數的功能是相當於把一個實數壓縮至0到1之間。當z是非常大的正數時,g(z)會趨近於1,而z是非常小的負數時,則g(z)會趨近於0。

壓縮至0到1有何用處呢?用處是這樣一來便可以把激活函數看作一種“分類的概率”,比如激活函數的輸出爲0.9的話便可以解釋爲90%的概率爲正樣本。

舉個例子,如下圖(圖引自Stanford機器學習公開課):
 

補充,爲什麼需要原點對稱:

一句話總結就是:sigmoid函數處理完輸出都是0-1的正值,沒有負值。y = w1*x1+w2*x2+b,如果w1 = 20, w2=20,w1 < w1*,w2 > w2*,那麼需要一個增大,一個下降,而這個只能下降。

https://liam.page/2018/04/17/zero-centered-active-function/?from=singlemessage&isappinstalled=0 

神經網絡激活函數的使用原因?

  • 如果不用激勵函數,每一層輸出都是上層輸入的線性函數,無論神經網絡有多少層,輸出都是輸入的線性組合。
  • 如果使用的話,激活函數給神經元引入了非線性因素,使得神經網絡可以任意逼近任何非線性函數,這樣神經網絡就可以應用到衆多的非線性模型中。

神經網絡中激活函數的真正意義?一個激活函數需要具有哪些必要的屬性?

  1. 非線性:即導數不是常數。這個條件前面很多答主都提到了,是多層神經網絡的基礎,保證多層網絡不退化成單層線性網絡。這也是激活函數的意義所在。 
  2. 幾乎處處可微:可微性保證了在優化中梯度的可計算性。傳統的激活函數如sigmoid等滿足處處可微。對於分段線性函數比如ReLU,只滿足幾乎處處可微(即僅在有限個點處不可微)。對於SGD算法來說,由於幾乎不可能收斂到梯度接近零的位置,有限的不可微點對於優化結果不會有很大影響[1]。 
  3. 計算簡單:正如題主所說,非線性函數有很多。極端的說,一個多層神經網絡也可以作爲一個非線性函數,類似於Network In Network[2]中把它當做卷積操作的做法。但激活函數在神經網絡前向的計算次數與神經元的個數成正比,因此簡單的非線性函數自然更適合用作激活函數。這也是ReLU之流比其它使用Exp等操作的激活函數更受歡迎的其中一個原因。 
  4. 非飽和性(saturation):飽和指的是在某些區間梯度接近於零(即梯度消失),使得參數無法繼續更新的問題。最經典的例子是Sigmoid,它的導數在x爲比較大的正值和比較小的負值時都會接近於0。更極端的例子是階躍函數,由於它在幾乎所有位置的梯度都爲0,因此處處飽和,無法作爲激活函數。ReLU在x>0時導數恆爲1,因此對於再大的正值也不會飽和。但同時對於x<0,其梯度恆爲0,這時候它也會出現飽和的現象(在這種情況下通常稱爲dying ReLU)。Leaky ReLU[3]和PReLU[4]的提出正是爲了解決這一問題。

sigmoid和softmax的區別:

• 如果模型輸出爲非互斥類別,且可以同時選擇多個類別,則採用Sigmoid函數計算該網絡的原始輸出值。

• 如果模型輸出爲互斥類別,且只能選擇一個類別,則採用Softmax函數計算該網絡的原始輸出值。

參考https://m.sohu.com/a/321563936_100118081/?pvid=000115_3w_a&from=groupmessage

——————————————————————————————————————————————————————————

https://liam.page/2018/04/17/zero-centered-active-function/?from=singlemessage&isappinstalled=0

——————————————————————————————————————————————————————

手推LR

參考鏈接:

https://zhuanlan.zhihu.com/p/35709485

https://blog.csdn.net/suipingsp/article/details/41822313?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

BP推導

https://blog.csdn.net/qq_29762941/article/details/80343185?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-8&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-8

————————————————————————————————————————————————————

優化算法及其優缺點?

GD梯度下降法
1) 批量梯度下降 
優點:可以一定程度上解決局部最優解的問題 
缺點:收斂速度較慢 
2)隨機梯度下降 
優點:容易陷入局部最優解 
缺點:收斂速度較快 
3)mini_batch梯度下降 
綜合隨機梯度下降和批量梯度下降的優缺點,提取的一箇中和的方法。 
動量Momentum優化法:

引入指數加權平均,在更新新的梯度時考慮以前的梯度信息,解決梯度下降中擺動比較大的問題。

RMSprop算法:

在梯度的分母上加了一個均方根,二次動量,可以自適應的調節學習率。

AdamAdam通常被認爲對超參數的選擇相當魯棒,適合解決含大規模數據和參數的優化問題

  • 首先,Adam中動量直接併入了梯度一階矩(指數加權)的估計。其次,相比於缺少修正因子導致二階矩估計可能在訓練初期具有很高偏置的RMSProp,Adam包括偏置修正,偏置修正針對的是早期的預測,修正從原點初始化的一階矩(動量項)和(非中心的)二階矩估計。

     

https://blog.csdn.net/weixin_40170902/article/details/80092628?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-4&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-4

https://blog.csdn.net/qsczse943062710/article/details/76763739?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1

——————————————————————————————————————————————————————

CV領域很重要的網絡架構:

一、LeNet-5

現在版本的 LeNet-5 輸出層一般會採用 softmax 激活函數,在 LeNet-5 提出的論文中使用的激活函數不是 softmax,但其現在不常用。該層神經元數量爲 10,代表 0~9 十個數字類別。(圖 1 其實少畫了一個表示全連接層的方框,而直接用 y^y^ 表示輸出層。 )

LeNet5性質:

  • 結構是卷積+池化+卷積+池化+全連接3,共七層,卷積核5*5,是最早的卷積神經網絡架構之一
  • 之後卷積+池化+全連接被廣泛使用
  • LeNet-5 大約有 60,000 個參數。
  • 隨着網絡越來越深,圖像的高度和寬度在縮小,與此同時,圖像的 channel 數量一直在增加。
  • 現在常用的 LeNet-5 結構和 Yann LeCun 教授在 1998 年論文中提出的結構在某些地方有區別,比如激活函數的使用,現在一般使用 ReLU 作爲激活函數,輸出層一般選擇 softmax。

二、AlexNet

Alex網絡特點

1. 更深的網絡結構,網絡參數很大

2. 使用層疊的卷積層,即卷積層+卷積層+池化層來提取圖像的特徵

3. 使用Dropout抑制過擬合

4. 使用數據增強Data Augmentation抑制過擬合

5. 使用Relu替換之前的sigmoid的作爲激活函數

6. 多GPU訓練

三、VGG網絡

  • VGG-16 中所有卷積層 filter 寬和高都是 3,步長爲 1,padding 都使用 same convolution;所有池化層的 filter 寬和高都是 2,步長都是 2。

見上面總結。

四、ResNET

ResNet和VGG Net的對比以及創新

ResNet提出residual learning的思想。ResNet通過直接將輸入信息繞道傳到輸出,保護信息的完整性,整個網絡只需要學習輸入、輸出差別的那一部分,簡化學習目標和難度。RetNet和VGG Net最大的區別在於前者有很多的旁路將輸入直接連接到後面的層,這種結構也被稱爲shortcut

在ResNet網絡結構中會用到兩種殘差模塊,一種是以兩個3*3的卷積網絡串接在一起作爲一個殘差模塊,另外一種是1*1、3*3、1*1的3個卷積網絡串接在一起作爲一個殘差模塊。ResNet有不同的網絡層數,常用的是50-layer,101-layer,152-layer,他們都是由以下兩種殘差模塊堆疊在一起實現的。 


詳細見上面總結

參考:

https://www.cnblogs.com/wuliytTaotao/p/9544625.html 【寫的很清楚】

五、GoogleNet Inception網絡

1*1卷積核的作用:

1、增添了一個非線性函數,可以改變輸入的通道數量

2、通過構建1*1卷積來構建瓶頸,從而降低計算成本

Inception網絡

1*1, 3*3, 5*5 和池化層並行,一同訓練,組成Inception網絡。

作用:代替人工來確定卷積層中的過濾器類型,從而確定是否構建卷積或者池化。

基於Inception構建了GoogLeNet的網絡結構(共22層)

網絡特點如下:【Inception結構、計算高效】

1. GoogLeNet採用了模塊化的結構(Inception結構),方便增添和修改;

2. 網絡最後採用了average pooling來代替FC,該想法來自NIN,可以將準確率提高0.6%。但是,實際在最後還是加了一個FC,主要是爲了方便對輸出進行靈活調整;

3. 雖然移除了FC,但是網絡中依然使用了Dropout ; 

4. 爲了避免梯度消失,網絡額外增加了2個輔助的softmax用於向前傳導梯度。輔助分類器是將中間某一層的輸出用作分類,並按一個較小的權重(0.3)加到最終分類結果中,這樣相當於做了模型融合,同時給網絡增加了反向傳播的梯度信號,也提供了額外的正則化。但是在實際測試的時候,這兩個額外的softmax會被去掉。

整個架構中使用了9個Inception 模型,總共22層。這已經很深了……沒有使用完全連接的層。他們使用一個平均池代替,從 7x7x1024 的體積降到了 1x1x1024,這節省了大量的參數。比AlexNet的參數少了12X在測試中,相同圖像的多個剪裁建立,然後填到網絡中,計算softmax probabilities的均值,然後我們可以獲得最後的解決方案。在感知模型中,使用了R-CNN中的概念。Inception有一些升級的版本(版本6和7),“少數高端的GPU”一週內就能完成訓練。

https://blog.csdn.net/weixin_43821874/article/details/102980949

正則化問題 dropout L1 L2

1、什麼是過擬合?過擬合的原因是什麼?如何解決

所謂過擬合,指的是當一個模型過於複雜之後,它可以很好地“記憶”每一個訓練數據中隨機噪聲的部分而忘記了要去學習訓練數據中通用的趨勢。

原因:

  • 數據:數據不規範,數據量少,數據穿越,統計特徵用到了未來的信息或者標籤信息 
  • 算法:算法過於複雜 

解決: 1.數據擴充(數據增強)2.正則化3、BN4、early stopping
 

2、正則化的作用

降低過擬合,提高模型的泛化能力。

正則化是針對過擬合而提出的,以爲在求解模型最優的是一般優化最小的經驗風險,現在在該經驗風險上加入模型複雜度這一項(正則化項是模型參數向量的範數),並使用一個rate比率來權衡模型複雜度與以往經驗風險的權重,如果模型複雜度越高,結構化的經驗風險會越大,現在的目標就變爲了結構經驗風險的最優化,可以防止模型訓練過度複雜,有效的降低過擬合的風險。 

3、L1/L2正則化?

在Loss中加入刻畫模型複雜度的指標,λ表示模型複雜損失在總損失中的比例。無論哪種方式基本思想都是通過限制權重的大小,使得模型不能任意擬合訓練數據中的隨機噪聲。

L1/L2區別:

L1會讓權重稀疏的更徹底【好多參數爲0】,L2也會讓權重衰減,但是不會到0【如0.001的平方就很小了,不至於再降到0】;

L2是處處可導的,而L1存在拐點,不是處處可導的。

https://charlesliuyx.github.io/2017/10/03/【直觀詳解】什麼是正則化/

詳細:

L1和L2的區別 

  • 1、L1是Lasso Regression,表示向量中每個元素絕對值的和:L1範數的解通常是稀疏性的,傾向於選擇數目較少的一些非常大的值或者數目較多的insignificant的小值。 
  • 2、L2是嶺迴歸,Ridge Regression,是歐氏距離也就是平方和的平方根。L2範數越小,可以使得w的每個元素都很小,接近於0,但L1範數不同的是他不會讓它等於0而是接近於0。 
  • 3、L1正則化的w可取的值是轉置的方形,L2對應的是圓形。這樣損失函數l(w)的最小值更容易在L1對應的邊角上取得,從而這些維度變成0了。 
  • 4、從貝葉斯的角度來看,加入正則項相當於加入了一種先驗。即當訓練一個模型時,僅依靠當前的訓練數據集是不夠的,爲了實現更好的泛化能力,往往需要加入先驗項。 L1範數相當於加入了一個Laplacean先驗;L2範數相當於加入了一個Gaussian先驗。 
  • 5、L2對大數的懲罰更大,但是解相對來說比較均勻。

 

4、dropout

參數:keep_prob刪除節點的概率,隨機消除一定的節點,使得網絡簡單,這樣不會過分依賴某一特徵,也達到了權重衰減得作用。防止參數過分依賴訓練數據,增加參數對數據集的泛化能力,讓其他神經元向泛化能力更好的方向學習。

dropout 包括參數的設置,還有實現的細節,比如輸出/p,從而保證期望相同(重要)

關鍵詞:隨即刪除,bernoulli二項式分佈,隨機生成01向量,縮放處理。

爲什麼要縮放?

在源代碼中,p爲丟棄概率,那麼1-p就爲保留概率,縮放的時候某個點的輸出期望爲E(x) = (1-p)(x/(1-p)) + p * 0 = x,因此輸出的時候就不用特殊處理。

詳細見這篇博客,公式什麼的也需要弄懂https://blog.csdn.net/program_developer/article/details/80737724

https://blog.csdn.net/stdcoutzyx/article/details/49022443?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2

網絡不收斂的原因及工程中如何分析處理

train loss與test loss結果分析【採用交叉驗證法分析】

train loss 不斷下降,test loss不斷下降,說明網絡仍在學習;

train loss 不斷下降,test loss趨於不變,說明網絡過擬合;

train loss 趨於不變,test loss不斷下降,說明數據集100%有問題;

train loss 趨於不變,test loss趨於不變,說明學習遇到瓶頸,需要減小學習率或批量數目;

train loss 不斷上升,test loss不斷上升,說明網絡結構設計不當,訓練超參數設置不當,數據集經過清洗等問題。

網絡不收斂原因

訓練技巧:

因此在訓練時,先用小樣本測試一下網絡的訓練是否逐漸下降到0,如果loss不下降需要調試學習率和檢查數據歸一化問題,從而減輕計算成本。【對於如何調參,參考吳恩達課程】

偏差、方差:

方法:1、先看偏差高不高,也就是訓練loss收斂的好不好;解決:需要更深的網絡,尋找適合的網絡架構

            2、如果方差高,出現過擬合;解決:1、更多數據,數據增強;2、正則化方法l2正則化和dropout;3、early stopping

具體的超參調整見博客。

https://blog.csdn.net/qq_20259459/article/details/70316511?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-3&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-3

——————————————————————————————————————————————————

總結部分;項目闡述和項目難點

項目闡述

本項目用深度學習算法解決圖像去噪問題,算法主題使用卷積神經網絡、批量歸一化、數據增強技術和殘差學習等方法。

首先實現盲高斯去噪和非盲高斯去噪,之後擴展並實現對高斯噪聲、椒鹽噪聲、泊松噪聲這三種噪聲進行盲去噪。

項目難點

1、前期知識儲備,學深度學習的基礎知識;看神經網絡的書和吳恩達課程,學習tensorflow的使用

2、機器運行速度達不到,沒有gpu的使用,本科畢設老師不讓用;使用google colab掛載,使用雲GPU;剛開始沒經驗,直接把數據堆上去,計算成本很大,後來瞭解到降低計算成本的方法,先取少量數據看訓練loss是否持續下降到0,從而判斷數據和學習率、模型等發揮了效果;

貼Shuffle實現原理

Python裏面random.shuffle源碼如下:

 1   def shuffle(self, x, random=None, int=int):
 2         """x, random=random.random -> shuffle list x in place; return None.
 3 
 4         Optional arg random is a 0-argument function returning a random
 5         float in [0.0, 1.0); by default, the standard random.random.
 6         """
 7 
 8         if random is None:
 9             random = self.random
10         for i in reversed(xrange(1, len(x))):
11             # pick an element in x[:i+1] with which to exchange x[i]
12             j = int(random() * (i+1))
13             x[i], x[j] = x[j], x[i]

 

  核心的代碼就3行,其實就是非常經典的Fisher–Yates shuffle算法的實現,Fisher–Yates shuffle算法僞碼如下:

-- To shuffle an array a of n elements (indices 0..n-1):
for i from n−1 downto 1 do
     j ← random integer such that 0 ≤ ji
     exchange a[j] and a[i]

  第一步 即從0到N-1個元素中隨機選擇一個與第N-1個替換

  第二步 從0到N-2個元素中隨機選擇一個與第N-2個替換

  第k步 從0到N-k個元素中隨機選擇一個與第N-K個替換

 

  要證明算法的正確性也很簡單,即任何一個元素shuffle之後出現在任意位置的概率都是1/N。任意一個元素,放在第N-1個位置的概率是1/N, 放在pos N-2的位置是 (N-1)/N * 1 / (N-1) = 1/N 。需要注意的是,一個元素一旦被交換到了序列的尾部,那麼就不會再被選中,這也是算法一目瞭然的原因。

Shuffle是一種訓練的技巧,因爲機器學習其假設和對數據的要求就是要滿足獨立同分布。

作用:Shuffle可以防止訓練過程中的模型抖動,有利於模型的健壯性;

Shuffle可以防止過擬合,並且使得模型學到更加正確的特徵。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章