深度學習之卷積神經網絡(Convolutional Neural Networks, CNN)

前面, 介紹了DNN及其參數求解的方法(深度學習之 BP 算法),我們知道DNN仍然存在很多的問題,其中最主要的就是BP求解可能造成的梯度消失和梯度爆炸.那么,人們又是怎么解決這個問題的呢?本節的卷積神經網絡(Convolutional Neural Networks, CNN)就是一種解決方法.

????我們知道神經網絡主要有三個部分組成, 分別為:?

  1. 網絡結構 ——?描述神經元的層次與連接神經元的結構.
  2. 激活函數(激勵函數) ——?用于加入非線性的因素,?解決線性模型所不能解決的問題.
  3. 參數學習方法的選擇(一般為權重值W和偏置項b) —— 如BP算法等.

我們將主要從這幾個方面進行講述.

1 CNN的應用領域

CNN在以下幾個領域均有不同程度的應用:

  1. 圖像處理領域(最主要運用領域) —— 圖像識別和物體識別,圖像標注,圖像主題生成,圖像內容生成,物體標注等。
  2. 視頻處理領域 ——?視頻分類,視頻標準,視頻預測等
  3. 自然語言處理(NLP)領域 ——?對話生成,文本生成,機器翻譯等
  4. 其它方面 ——?機器人控制,游戲,參數控制等

2 CNN的網絡結構??

2.1 傳統神經網絡

上圖為傳統的神經網絡的結構, 它是一種全連接的結構, 這也就造成了參數訓練的難度加深. 還有BP求解中的可能出現的梯度爆炸和梯度消失的現象等.此外,深度結構(涉及多個非線性處理單元層)非凸目標代價函數中普遍存在的局部最小是訓練困難的主要來源.?這些因素都造成了傳統的神經網絡的不適用性,所以沒有較為廣泛的運用.

2.2 卷積神經網絡(Convolutional Neural Networks,CNN)

上圖為CNN的網絡結構,CNN可以有效的降低反饋神經網絡(傳統神經網絡)的復雜性,常見的CNN結構有LeNet-5、AlexNet、ZFNet、VGGNet、GoogleNet、ResNet等等,其中在LVSVRC2015 冠軍ResNet的網絡層次是AlexNet的20多倍,是VGGNet的8倍;從這些結構來講CNN發展的一個方向就是層次的增加,通過這種方式可以利用增加的非線性得出目標函數的近似結構,同時得出更好的特征表達,但是這種方式導致了網絡整體復雜性的增加,使網絡更加難以優化,很容易過擬合。

CNN的網絡結構和傳統神經網絡結構異同點有:?

  1. CNN主要有數據輸入層, 卷積層, RELU激勵層, 池化層, 全連接層, Batch Normalization Layer(不一定存在). 傳統神經網絡主要有數據輸入層, 一個或多個隱層以及數據輸出層. 比較可以發現CNN仍然使用傳統神經網絡的層級結構.?
  2. CNN的每一層都具有不同的功能, 而傳統神經網絡每一層都是對上一層特征進行線性回歸, 再進行非線性變換的操作.
  3. CNN使用RELU作為激活函數(激勵函數) ,?傳統神經網絡使用sigmoid函數作為激活函數.
  4. CNN的池化層實現數據降維的作用,提取數據的高頻信息.傳統神經網絡沒有這個作用.

CNN主要是在圖像分類物品識別等應用場景應用比較多

2.2.0 CNN的主要層次介紹

CNN保持了層級網絡結構,不同層次使用不同的形式(運算)與功能

  • 數據輸入層:Input Layer
  • 卷積計算層:CONV Layer
  • ReLU激勵層:ReLU Incentive Layer
  • 池化層:Pooling Layer
  • 全連接層:FC Layer
  • 備注:Batch Normalization Layer(可能有)

2.2.1 數據輸入層 (Input Layer)

和神經網絡/機器學習一樣,需要對輸入的數據需要進行預處理操作,需要進行預處理的主要原因是:

  • 輸入數據單位不一樣,可能會導致神經網絡收斂速度慢,訓練時間長
  • 數據范圍大的輸入在模式分類中的作用可能偏大,而數據范圍小的作用就有可能偏小
  • 由于神經網絡中存在的激活函數是有值域限制的,因此需要將網絡訓練的目標數據映射到激活函數的值域
  • S形激活函數在(0,1)區間以外區域很平緩,區分度太小。例如S形函數f(X),f(100)與f(5)只相差0.0067

常見的數據預處理的方式有以下幾種:

  1. 均值化處理 --- 即對于給定數據的每個特征減去該特征的均值(將數據集的數據中心化到0)
  2. 歸一化操作 --- 在均值化的基礎上再除以該特征的方差(將數據集各個維度的幅度歸一化到同樣的范圍內)
  3. PCA降維 --- 將高維數據集投影到低維的坐標軸上, 并要求投影后的數據集具有最大的方差.(去除了特征之間的相關性,用于獲取低頻信息)
  4. 白化 --- 在PCA的基礎上, 對轉換后的數據每個特征軸上的幅度進行歸一化.用于獲取高頻信息.
  5. ?http://ufldl.stanford.edu/wiki/index.php/白化

  • 上面分別為:原圖、x = x - np.mean(x, 0)、x = (x - np.mean(x, 0)) / np.std(x, 0)

  • 上圖分別為:原圖、PCA、白化
  • x -= np.mean(x, axis=0) # ?去均值
  • cov = np.dot(x.T, x) / x.shape[0] # ?計算協方差
  • u, s, v = np.linalg.svd(cov) # ?進行 svd 分解
  • xrot = np.dot(x, u)
  • x = np.dot(x, u[:, :2]) # ?計算 pca???
  • x = xrot / np.sqrt(s + 1e-5)?# ?白化

備注:雖然我們介紹了PCA去相關和白化的操作,但是實際上在卷積神經網絡中,一般并不會適用PCA和白化的操作,一般去均值和歸一化使用的會比較多.

建議:對數據特征進行預處理,去均值、歸一化

2.2.2 卷積計算層(CONV Layer)

這一層就是卷積神經網絡最重要的一層,也是“卷積神經網絡”的名字由來。??

人的大腦在識別圖片的過程中,會由不同的皮質層處理不同方面的數據,比如:顏色、形狀、光暗等,然后將不同皮質層的處理結果進行合并映射操作,得出最終的結果值,第一部分實質上是一個局部的觀察結果,第二部分才是一個整體的結果合并.

還有,對于給定的一張圖片, 人眼總是習慣性的先關注那些重要的點(局部), 再到全局. 局部感知是將整個圖片分為多個可以有局部重疊的小窗口, 通過滑窗的方法進行圖像的局部特征的識別.?也可以說每個神經元只與上一層的部分神經元相連, 只感知局部, 而不是整幅圖像.

基于人腦的圖片識別過程,我們可以認為圖像的空間聯系也是局部的像素聯系比較緊密,而較遠的像素相關性比較弱,所以每個神經元沒有必要對全局圖像進行感知,只要對局部進行感知,而在更高層次對局部的信息進行綜合操作得出全局信息;即局部感知。

  • 局部關聯:每個神經元看做一個filter
  • 窗口(receptive field)滑動,filter對局部數據進行計算
  • 相關概念:深度:depth,步長:stride,填充值:zero-padding

CONV過程參考:http://cs231n.github.io/assets/conv-demo/index.html

一個數據輸入,假設為一個RGB的圖片

在神經網絡中,輸入是一個向量,但是在卷積神經網絡中,輸入是一個多通道圖像(比如這個例子中有3個通道)

1) 局部感知

在進行計算的時候,將圖片劃分為一個個的區域進行計算/考慮;

那么,為什么可以使用局部感知呢?

我們發現, 越是接近的像素點之間的關聯性越強, 反之則越弱. 所以我們選擇先進行局部感知, 然后在更高層(FC層)將這些局部信息綜合起來得到全局信息的方式.

2)?參數共享機制

所謂的參數共享就是就是同一個神經元使用一個固定的卷積核去卷積整個圖像,也可以認為一個神經元只關注一個特征.?而不同的神經元關注多個不同的特征.(每一個神經元都可以看作一個filter)

固定每個神經元的連接權重,可以將神經元看成一個模板;也就是每個神經元只關注一個特性

需要計算的權重個數會大大的減少

3)?滑動窗口的重疊

滑動窗口重疊就是在進行滑窗的過程中對于相鄰的窗口有局部重疊的部分,這主要是為了保證圖像處理后的各個窗口之間的邊緣的平滑度。降低窗口與窗口之間的邊緣不平滑的特性。

4)) 卷積計算

卷積的計算就是: 對于每一個神經元的固定的卷積核矩陣與窗口矩陣的乘積(對應位置相乘)再求和之后再加上偏置項b的值, 就得到了代表該神經元所關注的特征在當前圖像窗口的值.

如圖2.4所示, 可以看出卷積計算的過程.動態圖點擊這里查看.

2.2.3 RELU激勵層

這一層就是激活層, 在CNN中一般使用RELU函數作為激活函數.它的作用主要是將卷積層的輸出結果做非線性映射.

1) 常見的幾種激活函數

激活函數之 Sigmoid、tanh、ReLU、ReLU變形和Maxout

  1. sigmoid函數(S函數)
  2. Tanh函數(2S函數)
  3. RELU函數?---->?線性修正單元?---> max{ 0, x } ==>無邊界, 易出現'死神經元'
  4. Leaky ReLU?函數?---> 若x> 0 , 則輸出x ; 若x<0,則?alpha*x,?其中 0< alpha <1??==> 對RELU的改進
  5. ELU?函數 --->?若x> 0 , 則輸出x ; 若x<0,則?alpha*(e^x - 1),?其中 0< alpha <1??==> 也是一種對RELU的改進
  6. Maxout函數 ---> 相當于增加了一個激活層

2) 激活函數的一些建議

  1. 一般不要使用sigmoid函數作為CNN的激活函數.如果用可以在FC層使用.
  2. 優先選擇RELU作為激活函數,因為迭代速度快,但是有可能效果不佳
  3. 如果2失效,請用Leaky ReLU或者Maxout,此時一般情況都可以解決啦
  4. 在極少的情況下, tanh也是有不錯的效果的

2.2.4 池化層 (Poling Layer)

在連續的卷積層中間存在的就是池化層,主要功能是:通過逐步減小表征的空間尺寸來減小參數量和網絡中的計算;池化層在每個特征圖上獨立操作。使用池化層可以壓縮數據和參數的量,減小過擬合。簡而言之,如果輸入是圖像的話,那么池化層的最主要作用就是壓縮圖像。

池化層中的數據壓縮的策略主要有:

  1. Max Pooling(最大池化)---> 選擇每個小窗口中最大值作為需要的特征像素點(省略掉不重要的特征像素點)
  2. Average Pooling(平均池化) --->??選擇每個小窗口中平均值作為需要的特征像素點

????池化層選擇較為重要的特征點, 可以降低維度, 能夠在一定程度上防止過擬合的發生.

2.2.5 FC全連接層

類似傳統神經網絡中的結構,FC層中的神經元連接著之前層次的所有激活輸出;換一句話來講的話,就是兩層之間所有神經元都有權重連接;通常情況下,在CNN中,FC層只會在尾部出現

通過全連接結構,將前面輸出的特征重新組合成一張完整的圖像.

一般的CNN結構依次為:

  • INPUT
  • [[CONV -> RELU] * N -> POOL?]*M
  • [FC -> RELU] * K
  • FC

2.2.6 Batch Normalization Layer(一般用于卷積層后面,主要是使得期望結果服從高斯分布,好像使用之后可以更快的收斂)

Batch Normalization Layer(BN Layer)是期望我們的結果是服從高斯分布的,所以對神經元的輸出進行一下修正,一般放到卷積層后,池化層前。

  • 論文:Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift;
  • 論文鏈接:https://arxiv.org/pdf/1502.03167v3.pdf

如果輸出的是N*D的結果,對D個維度每個維度求解均值和方差。

根據均值和方差做歸一化。(其實就是上面的去均值和除以方差)

強制的進行歸一化操作可能存在一些問題,eg: 方差為0等

Batch Normalization優點:

  • 梯度傳遞(計算)更加順暢,不容易導致神經元飽和(防止梯度消失(梯度彌散)/梯度爆炸)
  • 學習率可以設置的大一點
  • 對于初始值的依賴減少

Batch Normalization缺點:

  • 如果網絡層次比較深,加BN層的話,可能會導致模型訓練速度很慢。

備注:BN Layer慎用!!!

3 CNN的優缺點

優點

????① 使用局部感知和參數共享機制(共享卷積核), 對于較大的數據集處理能力較高.對高維數據的處理沒有壓力

????② 能夠提取圖像的深層次的信息,模型表達效果好.

????③ 不需要手動進行特征選擇, 只要訓練好卷積核W和偏置項b, 即可得到特征值.

缺點

????① 需要進行調參, 模型訓練時間較長, 需要的樣本較多, 一般建議使用GPU進行模型訓練.

????② 物理含義不明, 每層中的結果無法解釋, 這也是神經網絡的共有的缺點.?
?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/454083.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/454083.shtml
英文地址,請注明出處:http://en.pswp.cn/news/454083.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Oracle DBA課程系列筆記(16)

第十六章&#xff1a; 用戶管理 1、schema &#xff1a; user.object &#xff0c;用戶認證方式&#xff1a;os 認證&#xff0c;database 認證 2、建立 database認證的用戶&#xff1a; 10:00:48 SQL> create user rose …

python序列是幾維_從一個1維的位數組獲得一個特定的2維的1序列數組[Python] - python...

我正在使用Python&#xff0c;我需要找到執行以下任務的最有效方法。任務&#xff1a;給定零和一的任何一維數組v&#xff0c;用k> 0表示v的所有一維的子序列數。我需要從v獲得一個二維數組w&#xff0c;使得&#xff1a;1)shape(w)(k&#xff0c;len(v))&#xff0c;2)對于…

深度學習之卷積神經網絡(Convolutional Neural Networks, CNN)(二)

前面我們說了CNN的一般層次結構, 每個層的作用及其參數的優缺點等內容.深度學習之卷積神經網絡(Convolutional Neural Networks, CNN)_fenglepeng的博客-CSDN博客 一 CNN參數初始化及參數學習方法 和機器學習很多算法一樣, CNN在進行訓練之前也要進行參數的初始化操作. 我們…

GCC Inline ASM GCC內聯匯編

GCC 支持在C/C代碼中嵌入匯編代碼&#xff0c;這些匯編代碼被稱作GCC Inline ASM——GCC內聯匯編。這是一個非常有用的功能&#xff0c;有利于我們將一些C/C語法無法表達的指令直接潛入C/C代碼中&#xff0c;另外也允許我們直接寫 C/C代碼中使用匯編編寫簡潔高效的代碼。1.基本…

Hadoop1.x版本升級Hadoop2.x

引言 隨著企業數據化和Hadoop的應用越加廣泛&#xff0c;hadoop1.x的框架設計越來越無法滿足人們對需求&#xff0c;Apache一直在對Hadoop1.x進行修改&#xff0c;最后推出了新一代的Hadoop2.x。從業界使用分布式系統的變化趨勢和 hadoop 框架的長遠發展來看&#xff0c;MapRed…

本頁由試用版打印控件lodop6.2.6輸出_Visual Basic 6.0 Sirk 迷你版

Visual Basic 6.0 Sirk 迷你版 VB6 Sirk Mini 2019更新1、支持主流操作系統&#xff0c;避免原版安裝失敗的問題&#xff1a;支持Windows XP、Vista、Win7、Win8、Win10(32位、64位)。2、保留大部分常用功能&#xff0c;避免精簡版過度精簡&#xff1a;包含原版完整控件&#x…

深度學習之卷積神經網絡 LeNet

卷積神經網絡典型CNN LeNet&#xff1a;最早用于數字識別的CNNLeNet5&#xff1a;現在常說的一般就是LeNet5AlexNet&#xff1a;2012ILSVRC冠軍&#xff0c;遠超第二名的CNN&#xff0c;比LeNet更深&#xff0c;用多層小卷積疊加來替換單個的大卷積ZF Net&#xff1a;2013ILSV…

python爬蟲常見反爬措施_爬蟲常見的反爬措施有哪些

爬蟲常見的反爬措施有三種&#xff1a;1、header頭部信息解決方法&#xff1a;加User-Agent值&#xff1a;如果不加header頭&#xff0c;部分網站服務器判斷不到用戶的訪問來源&#xff0c;所以會返回一個404錯誤來告知你是一個爬蟲&#xff0c;拒絕訪問&#xff0c;解決辦法如…

dom4j的讀寫xml文件,讀寫xml字符串

百度了一些博客&#xff0c;大同小異&#xff0c;在選取jar包工具的時候大概看了下&#xff0c;大抵是jdom原始&#xff0c;dom4j優秀。于是做了些練習。 參考&#xff1a;http://www.cnblogs.com/mengdd/archive/2013/06/05/3119927.html 1 package com.test.xml;2 3 import j…

深度學習之數據增強方案和TensorFlow操作

一、數據增強的方法介紹 增加訓練數據&#xff0c; 則能夠提升算法的準確率&#xff0c; 因為這樣可以避免過擬合&#xff0c; 而避免了過擬合你就可以增大你的網絡結構了。 當訓練數據有限的時候&#xff0c; 可以通過一些變換來從已有的訓練數據集中生成一些新的數據&#x…

移動前端頭部標簽(HTML5 head meta)

<!DOCTYPE html> <!-- 使用 HTML5 doctype&#xff0c;不區分大小寫 --> <html lang"zh-cmn-Hans"> <!-- 更加標準的 lang 屬性寫法 http://zhi.hu/XyIa --> <head><!-- 聲明文檔使用的字符編碼 --><meta charsetutf-8>&l…

python新建文件夾口令_python編程快速上手—口令保管箱

之前小編為大家整理了如何成為一個優秀的程序員應該具備的品質&#xff0c;接下來為大家展示一個簡單有趣的python小項目&#xff0c;從中體會編程的樂趣。小編了解這個小項目之后&#xff0c;很是驚奇&#xff0c;覺得python竟然還可以做這樣的事情。為什么要建立口令保管箱&a…

django+nginx+uwsgi部署web站點

環境&#xff1a; django&#xff1a;1.8.16 python&#xff1a;2.7.13 pip&#xff1a;2.7 uwsgi&#xff1a;2.0.15 project路徑&#xff1a; /opt/cmdb/ Uwsgi的安裝配置 1、安裝python2.7 &#xff08;省略安裝過程&#xff09; 2、安裝pip2.7 &#xff08;省略安裝過程&…

GCC源代碼閱讀

獲取GCC源代碼 閱讀源代碼的第一步是獲取源代碼&#xff0c;巧婦難為無米之炊嘛&#xff01; 使用以下任意方法均可獲得gcc源代碼&#xff1a; svn checkout svn://gcc.gnu.org/svn/gcc/trunk SomeLocalDir &#xff08;摘自http://gcc.gnu.org/svn.html&#xff09;git clone …

Nginx 動靜分離

頁面動靜分離 后端 調用tomcat 集群 示例&#xff1a; server { listen 80; server_name www.www2.com ; root /web/www2/htmlloation /img/ {alias /web/www2/html/img/;}location ~ (\.jsp)|(\.do)$ {proxy_pass http:## //serverip:port;proxy_redirect off;// 重定向 指…

Linux 狀態命令之內存狀態 vmstat

語法 vmstat 常見命令格式如下&#xff1a; vmstat [-a] [-n] [-S unit] [delay [ count]] vmstat [-s] [-n] [-S unit] vmstat [-m] [-n] [delay [ count]] vmstat [-d] [-n] [delay [ count]] vmstat [-p disk partition] [-n] [delay [ count]] vmstat [-f] vmstat [-V]命…

使用OpenSSL實現CA證書的搭建過程

個人博客地址&#xff1a;http://www.pojun.tech/ 歡迎訪問 什么是CA CA,Catificate Authority,通俗的理解就是一種認證機制。它的作用就是提供證書&#xff08;也就是服務端證書&#xff0c;由域名&#xff0c;公司信息&#xff0c;序列號&#xff0c;簽名信息等等組成&#…

最近公共祖先 python_求二叉搜索樹的最近公共祖先

給定一個二叉搜索樹, 找到該樹中兩個指定節點的最近公共祖先。百度百科中最近公共祖先的定義為&#xff1a;“對于有根樹 T 的兩個結點 p、q&#xff0c;最近公共祖先表示為一個結點 x&#xff0c;滿足 x 是 p、q 的祖先且 x 的深度盡可能大(一個節點也可以是它自己的祖先)。”…

gdb使用實例

第一篇 概論我們將學習使用gdb來調試通過一個通過串行線同PC相連的嵌入式系統。Gdb可以調試各種程序&#xff0c;包括C、C、JAVA、PASCAL、FORAN和一些其它的語言。包括GNU所支持的所有微處理器的匯編語言。在gdb的所有可圈可點的特性中&#xff0c;有一點值得注意&#xff0c;…

Linux 監控命令之 netstat

netstat命令用于顯示與IP、TCP、UDP和ICMP協議相關的統計數據&#xff0c;一般用于檢驗本機各端口的網絡連接情況。netstat是在內核中訪問網絡及相關信息的程序&#xff0c;它能提供TCP連接&#xff0c;TCP和UDP監聽&#xff0c;進程內存管理的相關報告。 語法 netstat [-acC…