用反卷積(Deconvnet)可視化理解卷積神經網絡還有使用tensorboard

『cs231n』卷積神經網絡的可視化與進一步理解

深度學習小白——卷積神經網絡可視化(二)

TensorBoard--TensorFlow可視化

原文地址:http://blog.csdn.net/hjimce/article/details/50544370

作者:hjimce

一、相關理論

本篇博文主要講解2014年ECCV上的一篇經典文獻:《Visualizing and Understanding Convolutional Networks》,可以說是CNN領域可視化理解的開山之作,這篇文獻告訴我們CNN的每一層到底學習到了什么特征,然后作者通過可視化進行調整網絡,提高了精度。最近兩年深層的卷積神經網絡,進展非常驚人,在計算機視覺方面,識別精度不斷的突破,CVPR上的關于CNN的文獻一大堆。然而很多學者都不明白,為什么通過某種調參、改動網絡結構等,精度會提高。可能某一天,我們搞CNN某個項目任務的時候,你調整了某個參數,結果精度飆升,但如果別人問你,為什么這樣調參精度會飆升呢,你所設計的CNN到底學習到了什么牛逼的特征?(PS:之前領導一直鄙視我,要我解釋CNN的每一層到底學習到了什么特征,解答不上來,被鄙視了一番,最后才去學了這篇文獻)。

這篇文獻的目的,就是要通過特征可視化,告訴我們如何通過可視化的角度,查看你的精度確實提高了,你設計CNN學習到的特征確實比較牛逼。這篇文獻是經典必讀文獻,才發表了一年多,引用次數就已經達到了好幾百,學習這篇文獻,對于我們今后深入理解CNN,具有非常重要的意義。總之這篇文章,牛逼哄哄。

二、利用反卷積實現特征可視化

為了解釋卷積神經網絡為什么work,我們就需要解釋CNN的每一層學習到了什么東西。為了理解網絡中間的每一層,提取到特征,paper通過反卷積的方法,進行可視化。反卷積網絡可以看成是卷積網絡的逆過程。反卷積網絡在文獻《Adaptive?deconvolutional?networks?for?mid?and?high?level?feature?learning》中被提出,是用于無監督學習的。然而本文的反卷積過程并不具備學習的能力,僅僅是用于可視化一個已經訓練好的卷積網絡模型,沒有學習訓練的過程。

反卷積可視化以各層得到的特征圖作為輸入,進行反卷積,得到反卷積結果,用以驗證顯示各層提取到的特征圖。舉個例子:假如你想要查看Alexnet?的conv5提取到了什么東西,我們就用conv5的特征圖后面接一個反卷積網絡,然后通過:反池化、反激活、反卷積,這樣的一個過程,把本來一張13*13大小的特征圖(conv5大小為13*13),放大回去,最后得到一張與原始輸入圖片一樣大小的圖片(227*227)。

1、反池化過程

我們知道,池化是不可逆的過程,然而我們可以通過記錄池化過程中,最大激活值得坐標位置。然后在反池化的時候,只把池化過程中最大激活值所在的位置坐標的值激活,其它的值置為0,當然這個過程只是一種近似,因為我們在池化的過程中,除了最大值所在的位置,其它的值也是不為0的。剛好最近幾天看到文獻:《Stacked What-Where Auto-encoders》,里面有個反卷積示意圖畫的比較好,所有就截下圖,用這篇文獻的示意圖進行講解:

以上面的圖片為例,上面的圖片中左邊表示pooling過程,右邊表示unpooling過程。假設我們pooling塊的大小是3*3,采用max?pooling后,我們可以得到一個輸出神經元其激活值為9,pooling是一個下采樣的過程,本來是3*3大小,經過pooling后,就變成了1*1大小的圖片了。而upooling剛好與pooling過程相反,它是一個上采樣的過程,是pooling的一個反向運算,當我們由一個神經元要擴展到3*3個神經元的時候,我們需要借助于pooling過程中,記錄下最大值所在的位置坐標(0,1),然后在unpooling過程的時候,就把(0,1)這個像素點的位置填上去,其它的神經元激活值全部為0。再來一個例子:

?

在max?pooling的時候,我們不僅要得到最大值,同時還要記錄下最大值得坐標(-1,-1),然后再unpooling的時候,就直接把(-1-1)這個點的值填上去,其它的激活值全部為0。

2、反激活

我們在Alexnet中,relu函數是用于保證每層輸出的激活值都是正數,因此對于反向過程,我們同樣需要保證每層的特征圖為正值,也就是說這個反激活過程和激活過程沒有什么差別,都是直接采用relu函數。

3、反卷積

對于反卷積過程,采用卷積過程轉置后的濾波器(參數一樣,只不過把參數矩陣水平和垂直方向翻轉了一下),這一點我現在也不是很明白,估計要采用數學的相關理論進行證明。

最后可視化網絡結構如下:

?

網絡的整個過程,從右邊開始:輸入圖片-》卷積-》Relu-》最大池化-》得到結果特征圖-》反池化-》Relu-》反卷積。到了這邊,可以說我們的算法已經學習完畢了,其它部分是文獻要解釋理解CNN部分,可學可不學。

總的來說算法主要有兩個關鍵點:1、反池化 ?2、反卷積,這兩個源碼的實現方法,需要好好理解。

三、理解可視化

特征可視化:一旦我們的網絡訓練完畢了,我們就可以進行可視化,查看學習到了什么東西。但是要怎么看?怎么理解,又是一回事了。我們利用上面的反卷積網絡,對每一層的特征圖進行查看。

1、特征可視化結果:

總的來說,通過CNN學習后,我們學習到的特征,是具有辨別性的特征,比如要我們區分人臉和狗頭,那么通過CNN學習后,背景部位的激活度基本很少,我們通過可視化就可以看到我們提取到的特征忽視了背景,而是把關鍵的信息給提取出來了。從layer 1、layer 2學習到的特征基本上是顏色、邊緣等低層特征;layer 3則開始稍微變得復雜,學習到的是紋理特征,比如上面的一些網格紋理;layer 4學習到的則是比較有區別性的特征,比如狗頭;layer 5學習到的則是完整的,具有辨別性關鍵特征。

2、特征學習的過程。作者給我們顯示了,在網絡訓練過程中,每一層學習到的特征是怎么變化的,上面每一整張圖片是網絡的某一層特征圖,然后每一行有8個小圖片,分別表示網絡epochs次數為:1、2、5、10、20、30、40、64的特征圖:

結果:(1)仔細看每一層,在迭代的過程中的變化,出現了sudden?jumps;(2)從層與層之間做比較,我們可以看到,低層在訓練的過程中基本沒啥變化,比較容易收斂,高層的特征學習則變化很大。這解釋了低層網絡的從訓練開始,基本上沒有太大的變化,因為梯度彌散嘛。(3)從高層網絡conv5的變化過程,我們可以看到,剛開始幾次的迭代,基本變化不是很大,但是到了40~50的迭代的時候,變化很大,因此我們以后在訓練網絡的時候,不要著急看結果,看結果需要保證網絡收斂。

3、圖像變換。從文獻中的圖片5可視化結果,我們可以看到對于一張經過縮放、平移等操作的圖片來說:對網絡的第一層影響比較大,到了后面幾層,基本上這些變換提取到的特征沒什么比較大的變化。

個人總結:我個人感覺學習這篇文獻的算法,不在于可視化,而在于學習反卷積網絡,如果懂得了反卷積網絡,那么在以后的文獻中,你會經常遇到這個算法。大部分CNN結構中,如果網絡的輸出是一整張圖片的話,那么就需要使用到反卷積網絡,比如圖片語義分割、圖片去模糊、可視化、圖片無監督學習、圖片深度估計,像這種網絡的輸出是一整張圖片的任務,很多都有相關的文獻,而且都是利用了反卷積網絡,取得了牛逼哄哄的結果。所以我覺得我學習這篇文獻,更大的意義在于學習反卷積網絡。

參考文獻:

1、《Visualizing and Understanding Convolutional Networks》

2、《Adaptive?deconvolutional?networks?for?mid?and?high?level?feature?learning》

3、《Stacked What-Where Auto-encoders》

?

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

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

相關文章

java線程實現及線程池的使用

Java線程實現 線程把處理器的調度和資源分配分開,是cpu的最小調度單位。多個線程可以共享進程的內存資源,又可以獨立調度。java線程關鍵方法都是通過高效的本地方法實現的。Java線程的主要實現方式有三種:內核實現、用戶實現、內核用戶混合實…

SOAP:簡單對象訪問協議

見:https://baike.baidu.com/item/%E7%AE%80%E5%8D%95%E5%AF%B9%E8%B1%A1%E8%AE%BF%E9%97%AE%E5%8D%8F%E8%AE%AE/3841505?fraladdin&fromid4684413&fromtitleSOAP 簡單對象訪問協議 SOAP(簡單對象訪問協議)一般指簡單對象訪問協議 …

程序調試

對拍 $ Windows $ 下的對拍程序 借助 \(Windows\) 腳本echo off :loop r.exe > input.in coronas.exe <input.in > output.a std.exe <input.in > output.b fc output.a output.b if not errorlevel 1 goto loop 一直沒有找到怎樣能控制對拍次數,今天終于醒悟,可…

不怕燒錢怕翻車:雷軍與馬化騰現場“過招”

說起微信&#xff0c;很多時尚潮人都很熟悉。這款軟件可以發送語音信息、可以在有無線網絡的地方免費發送、甚至只需搖一搖就能找到在你附近的用戶&#xff0c;這些方便、時尚、新穎的元素使微信受到了很多用戶的喜愛&#xff0c;也奪得了大量的市場。其實&#xff0c;在微信發…

php基礎(一)

1、header(contentType:text/html,charset:utf-8)設置編碼 2、查找字符串最后一次出現的 strrpos() 查找字符第一次出現的 strpos 3、array_sum() 返回數組值得和 4、func_num_args() 求函數參數的個數 5、func_get_args() 獲取函數的所有參數 6、匿名函數 例子 $anonymityfun…

Thread.yield()和Thread.sleep(0)

關于Thread.yield()和Thread.sleep(0)的語義問題真是一個讓人撓頭的問題&#xff0c;翻了好多資料&#xff0c;在java6語言規范中看到了一段這樣的描述&#xff1a; 重點在紅框中&#xff0c;簡而言之就是&#xff1a;sleep(0)和yield()的實現不需要任何可見的效果。那么在實現…

OOA:面向對象

見&#xff1a;https://baike.baidu.com/item/OOA/3659916?fraladdin OOA:面向對象&#xff1a; Object-Oriented Analysis&#xff08;面向對象分析方法&#xff09;是確定需求或者業務的角度&#xff0c;按照面向對象的思想來分析業務。例如&#xff1a;OOA只是對需求中描述…

DCT原型 ——傅里葉級數

傅里葉級數 法國數學家傅里葉發現&#xff0c;任何周期函數都可以用正弦函數和余弦函數構成的無窮級數來表示&#xff08;選擇正弦函數與余弦函數作為基函數是因為它們是正交的&#xff09;&#xff0c;后世稱為傅里葉級數&#xff08;法語&#xff1a;srie de Fourier&#xf…

c 遞歸算法

#include <stdio.h>double factorial(unsigned int i) {if(i < 1){return 1;}return i * factorial(i - 1); } int main() {int i 15;printf("%d 的階乘為 %f\n", i, factorial(i));return 0; } 轉載于:https://www.cnblogs.com/sea-stream/p/9822437.htm…

紅黑樹和B+樹

&#xff08;一&#xff09;紅黑樹 紅黑樹是一種自平衡二叉查找樹&#xff0c;也被稱為"對稱二叉B樹"&#xff0c;它可以在O(logn)時間內利用 O(logn)的空間來完成查找、插入、刪除操作。紅黑樹的讀操作與普通二叉查找樹相同&#xff0c;而插入和刪除操作可能會破壞…

策略模式、觀察者模式、代理模式、裝飾模式 應用場景和實現

有個大神寫的很好&#xff1a; 參考&#xff1a;設計模式學習筆記&#xff08;四&#xff1a;策略模式&#xff09; 參考&#xff1a;設計模式學習筆記&#xff08;二&#xff1a;觀察者模式&#xff09; 參考&#xff1a;設計模式學習筆記-代理模式 參考&#xff1a;設計模式-…

DQL、DML、DDL、DCL的概念與區別

http://blog.csdn.net/tomatofly/article/details/5949070 SQL語言的分類 SQL語言共分為四大類&#xff1a;數據查詢語言DQL&#xff08;Data Query Language&#xff09;&#xff0c;數據操縱語言DML&#xff0c;數據定義語言DDL(Data Definition Language)&#xff0c;數據…

python學習總結

1.python環境搭建方便&#xff0c;只需要安裝python解釋器 2.python把任意數據類型賦值給變量&#xff0c;不用定義類型 3.Python的整數浮點數沒有大小限制&#xff0c;不用擔心超過數值范圍。比如java的 int&#xff0c;long 4.python自帶最常用的list列表和dicitonary字典&am…

李國杰院士:國內開源社區的崛起需要一個過程

[CSDN.NET 付江/文]日前&#xff0c;在第二屆“龍芯杯”中國開源軟件設計大賽啟動儀式上&#xff0c;CSDN記者專訪了中國工程院院士、第三世界科學院院士李國杰。李國杰院士就國產基礎軟件現狀、面臨的機遇和挑戰、開源環境以及生態系統建設等話題分享了自己的看法。 打造自主…

SuperMap iObject入門開發系列之五管線屬性查詢

本文是一位好友“托馬斯”授權給我來發表的&#xff0c;介紹都是他的研究成果&#xff0c;在此&#xff0c;非常感謝。 管線屬性查詢功能針對單一管線圖層進行特定的條件查詢&#xff0c;然后將查詢結果輸出為列表&#xff0c;并添加點位閃爍功能&#xff0c;例如查詢污水管線中…

三類基于貪心思想的區間覆蓋問題

一、區間完全覆蓋問題 問題描述&#xff1a;給定一個長度為m的區間&#xff0c;再給出n條線段的起點和終點&#xff08;注意這里是閉區間&#xff09;&#xff0c;求最少使用多少條線段可以將整個區間完全覆蓋。 樣例&#xff1a;一個長度為8的區間&#xff0c;可選的線段有[2,…

ubuntu 常用軟件和命令

永久修改屏幕的分辨率   sudo gedit .profile 將下面的四句話加入。.profile文件的最后   cvt 1280 768   xrandr --newmode "1280x768_60.00" 79.50 1280 1344 1472 1664 768 771 781 798 -hsync vsync   xrandr --addmode Virtual1 "1280x768_60.00&q…

Eclipse搭建Android開發環境(安裝ADT,Android4.4.2)

見&#xff1a;http://blog.csdn.net/zht666/article/details/29837777 使用Eclipse做Android開發&#xff0c;需要先在Eclipse上安裝ADT&#xff08;Android Development Tools&#xff09;插件。 1.安裝JDK 1.7 JDK官網http://www.oracle.com/technetwork/java/javase/downlo…

C語言 位操作簡析

位運算 前面介紹的各種運算都是以字節作為最基本位進行的。 但在很多系統程序中常要求在位(bit)一級進行運算或處理。&#xff23;語言提供了位運算的功能&#xff0c; 這使得&#xff23;語言也能像匯編語言一樣用來編寫系統程序。 一、位運算符&#xff23;語言提供了六種位運…

算法:輸入一個鏈表,輸出該鏈表中倒數第k個結點。

算法&#xff1a;輸入一個鏈表&#xff0c;輸出該鏈表中倒數第k個結點。《劍指offer》 思路加到注釋里面了&#xff1b; 1&#xff1a;兩個if判斷是否返回值為空&#xff0c;首個為空&#xff0c;沒有第k個值&#xff1b; 2&#xff1a;for循環找到倒數第k個值&#xff0c;返回…