1. 程式人生 > >深度學習方法(十二):卷積神經網路結構變化——Spatial Transformer Networks

深度學習方法(十二):卷積神經網路結構變化——Spatial Transformer Networks

歡迎轉載,轉載請註明:本文出自Bin的專欄blog.csdn.net/xbinworld。
技術交流QQ群:433250724,歡迎對演算法、機器學習技術感興趣的同學加入。

今天具體介紹一個Google DeepMind在15年提出的Spatial Transformer Networks,相當於在傳統的一層Convolution中間,裝了一個“外掛”,可以使得傳統的卷積帶有了[裁剪]、[平移]、[縮放]、[旋轉]等特性;理論上,作者希望可以減少CNN的訓練資料量,以及減少做data argument,讓CNN自己學會資料的形狀變換。這篇論文我相信會啟發很多新的改進,也就是對卷積結構作出更多變化,還是比較有創意的。

背景知識:仿射變換、雙線性插值

在理解STN之前,先簡單瞭解一下基本的仿射變換、雙線性插值;其中,雙線性插值請跳轉至我剛剛寫的一篇更詳細的介紹“三十分鐘理解:線性插值,雙線性插值Bilinear Interpolation演算法”。這裡只放一個示意圖[1]:

這裡寫圖片描述

而仿射變換,這裡只介紹論文中出現的最經典的2D affine transformation,實現[裁剪]、[平移]、[縮放]、[旋轉],只需要一個[2,3]的變換矩陣:

這裡寫圖片描述

對於平移操作,仿射矩陣為:

這裡寫圖片描述

對於縮放操作,仿射矩陣為:

這裡寫圖片描述

對於旋轉操作,設繞原點順時針旋轉αα度,座標仿射矩陣為:
(這裡有個trick,由於影象的座標不是中心座標系,所以只要做下Normalization,把座標調整到[-1,1])[1]
這裡寫圖片描述

至於裁剪(Crop)操作,作者在論文中提到:

determinant of the left 2×2 sub-matrix has magnitude less than unity

其實作用就是讓變換後的座標範圍變小了,這樣就相當於從原圖中裁剪出來一塊;

Spatial Transformer Networks

OK,開始講正題。論文中作者講的比較簡略,所以初看有點費勁,而且我看了網上很多資料,很對博主自己也沒有理解清楚。最主要的結構圖,還是這張:

這裡寫圖片描述
圖1 STN架構

按照作者的說法,STN可以被安裝在任意CNN的任意一層中——這裡有些同學有誤解,以為上圖中U到V是原來的卷積,並且在卷積的路徑上加了一個分支,其實並不是,而是將原來的一層結果U,變換到了V,中間並沒有卷積的操作。看下圖右邊,通過U到V的變換,相當於又生成了一個新資料,而這個資料變換不是定死的而是學習來的,即然是學習來的,那它就有讓loss變小的作用,也就是說,通過對輸入資料進行簡單的空間變換,使得特徵變得更容易分類(往loss更小的方向變化)。另外一方面,有了STN,網路就可以動態地做到旋轉不變性,平移不變性等原本認為是Pooling層做的事情,同時可以選擇影象中最終要的區域(有利於分類)並把它變換到一個最理想的姿態(比如把字放正)。

這裡寫圖片描述

再回到前面圖1 STN架構中,分為三個部分:

  1. Localisation net
  2. Grid generator
  3. Sampler

Localisation net
把feature map U作為輸入,過連續若干層計算(如卷積、FC等),迴歸出引數θ,在我們的例子中就是一個[2,3]大小的6維仿射變換引數,用於下一步計算;

Grid generator
名字叫grid生成器,啥意思?理解了這個名字就理解了這一步做啥了——在source圖中找到用於做插值(雙線性插值)的grid。這也是很多人理解錯的地方。仔細看下前面公式1:

這裡寫圖片描述

s表示source(U中的座標),t表示target(V中的座標)。是不是很奇怪?因為前向計算中,是已知U的,而這個公式怎麼是把V做變換呢?——其實這裡的意思是,通過仿射變換,找到目標V中的座標點變換回source U中的座標在哪裡,而V這時候還沒有產生,需要通過下一層取樣器sampler來產生。

Sampler
作者也叫這一步Differentiable Image Sampling,是希望通過寫成一種形式上可微的影象取樣方法,目的是為了讓整個網路保持可以端到端反向傳播BP訓練,用一種比較簡潔的形式表示雙線性插值的公式:

這裡寫圖片描述

和最前面雙線性插值的示意圖含義是一樣的,只是因為在影象中,相鄰兩個點的座標差是1,就沒有分母部分了。而迴圈中大部分都沒用的,只取相鄰的四個點作為一個grid。

所以上面 2. Grid generator和 3. Sampler是配合的,先通過V中座標(xtarget,ytarget)以此找到它在U中的座標,然後再通過雙線性插值取樣出真實的畫素值,放到(xtarget,ytarget)。到這裡一層STN就結束了。最後再借用一張[1]作者的示意圖作為總結,還是比較清楚的(當然,[1]中作者寫的有些理解我看下來也有不準確的,裡面的評論區也有討論,讀者自己鑑別一下)。
這裡寫圖片描述

OK,本文就講到這裡,基本上前向過程都提到了,論文中還有關於求導(因為Sampler不連續,只能求Sub-Gradient)和訓練loss的一些內容,推薦讀者再結合論文看一下,這裡不寫了。另外,希望寫部落格的同學自己能夠多理解清楚一點再寫,不要隨便糊弄一下~~~

歡迎轉載,註明出處即可。預告一下,下一篇講一下最新MSRA的deformable convolutional network,和STN有很多相似的idea,也比較有意思。

參考資料

相關推薦

深度學習方法神經網路結構變化——Spatial Transformer Networks

歡迎轉載,轉載請註明:本文出自Bin的專欄blog.csdn.net/xbinworld。 技術交流QQ群:433250724,歡迎對演算法、機器學習技術感興趣的同學加入。 今天具體介紹一個Google DeepMind在15年提出的Spatial T

機器學習入坑指南神經網路

上一篇文章中,我們準備好了深度學習所需的資料。為了實現分辨貓狗的目的,我們決定使用卷積神經網路(Convolutional Neural Networks,CNN),目前它在影象識別方面十分受歡迎,那麼到底什麼是卷積神經網路呢?我們應該怎麼去理解它? 1 CNN

吳恩達深度學習筆記deeplearning.ai神經網路CNN

1. Padding 在卷積操作中,過濾器(又稱核)的大小通常為奇數,如3x3,5x5。這樣的好處有兩點: 在特徵圖(二維卷積)中就會存在一箇中心畫素點。有一箇中心畫素點會十分方便,便於指出過濾器的位置。 在沒有padding的情況下,經過卷積操作,輸出的資

Python3學習筆記閉包

ram 類型 trac 就是 不能 ast 兩種 作用 ror 閉包定義: 在一個外函數中定義了一個內函數,內函數裏引用了外函數的臨時變量,並且外函數的返回值是內函數的引用。這樣就構成了一個閉包。 我們先來看一個簡單的函數: def outer(a): b

java基礎學習總結深入理解java內部類

內部類 內部類也是語法糖,是因為它僅僅是一個編譯時的概念,outer.java裡面定義了一個內部類inner,一旦編譯成功,就會生成兩個完全不同的.class檔案了,分別是outer.class和outer$inner.class。所以內部類的名字完全可以和它的外部類名字相同。 內部類分為四

javaweb學習筆記JSP2

jsp(2) 目錄 jsp(2) 1.Jsp指令 1.1 include指令 1.2 page指令 1.3 taglib指令 2. Jsp的隱式物件 2.1 out物件 2.2 pageContext物件 1.J

學習筆記推薦系統-隱語義模型

#程式碼摘自唐宇迪《推薦系統》視訊課程,資料集來自http://pan.baidu.com/s/1eS5VZ8Y中的“ml-1m"資料 from collections import deque from six import next import readers import tensor

機器學習筆記TensorFlow實戰四影象識別與神經網路

1 - 卷積神經網路常用結構 1.1 - 卷積層 我們先來介紹卷積層的結構以及其前向傳播的演算法。 一個卷積層模組,包含以下幾個子模組: 使用0擴充邊界(padding) 卷積視窗過濾器(filter) 前向卷積 反向卷積(可選) 1.1

Python學習筆記lambda表示式與函數語言程式設計

以Mark Lutz著的《Python學習手冊》為教程,每天花1個小時左右時間學習,爭取兩週完成。 --- 寫在前面的話 2013-7-22 21:00 學習筆記 1,lambda的一般形式是關鍵字lambda後面跟一個或多個引數,緊跟一個冒號,以後是一個表示

機器學習筆記聚類

目錄 1)Unsupervised learning introduction 2)K-means algorithm 3)Optimization objective 4)Random initialization 5)Choosing the number of clus

Python3《機器學習實戰》學習筆記線性迴歸提高篇之樂高玩具套件二手價預測

一、前言 本篇文章講解線性迴歸的縮減方法,嶺迴歸以及逐步線性迴歸,同時熟悉sklearn的嶺迴歸使用方法,對樂高玩具套件的二手價格做出預測。 二、嶺迴歸 如果資料的特徵比樣本點還多應該怎麼辦?很顯然,此時我們不能再使用上文的方法進行計算了,因為矩陣X不是滿秩矩

機器學習筆記TensorFlow實現四影象識別與神經網路

1 - 卷積神經網路常用結構 1.1 - 卷積層 我們先來介紹卷積層的結構以及其前向傳播的演算法。 一個卷積層模組,包含以下幾個子模組: 使用0擴充邊界(padding) 卷積視窗過濾器(filter) 前向卷積 反向卷積(可選) 1.1.2 - 邊界填充

各種音視訊編解碼學習詳解之 編解碼學習筆記其他編解碼M-JPEG,Motion JPEG 2000,DivX

    最近在研究音視訊編解碼這一塊兒,看到@bitbit大神寫的【各種音視訊編解碼學習詳解】這篇文章,非常感謝,佩服的五體投地。奈何大神這邊文章太長,在這裡我把它分解成很多小的篇幅,方便閱讀。大神部落格傳送門:https://www.cnblogs.com/skyofbitbi

cortex_m3_stm32嵌入式學習筆記TFTLCD顯示深入庫函式

寫點比較常用的顯示函式。 首先顯示一張靜止的畫面,上面顯示字串(目前還不會顯示漢字) 只需要自己編寫主函式,將別人例程裡的lcd.c,lcd.h等相關標頭檔案加到工程即可 #include "led.h" #include "delay.h" #include "sys.

pytorch學習筆記詳解 Module 類

Module 是 pytorch 提供的一個基類,每次我們要 搭建 自己的神經網路的時候都要繼承這個類,繼承這個類會使得我們 搭建網路的過程變得異常簡單。 本文主要關注 Module 類的內部是怎麼樣

深度學習筆記--深度學習資料集MNIST、ImageNet、 COCO 、 VOC介紹

1.  MNIST 深度學習領域的“Hello World!”,入門必備!MNIST是一個手寫數字資料庫,它有60000個訓練樣本集和10000個測試樣本集,每個樣本影象的寬高為28*28。此資料集是以二進位制儲存的,不能直接以影象格式檢視,不過很容易找到將其轉換成

Docker學習筆記Docker Swarm

1. 什麼是Docker Swarm? 容器叢集管理工具。 通過docker swarm可以將多臺機器連線在一起,通過swarm的排程可以服務的多臺機器的部署,服務的伸縮。 2. Docker Swarm 使用入門 1)節點初始化(manager節點) dock

計算機圖形學 學習筆記顏色模型,簡單 / 增量 光照模型

接下來將介紹真實感圖形學的內容。 真實感圖形學包括:顏色模型,簡單光照模型,增量光照模型,區域性光照模型和投射模型,整體光照模型,紋理對映和陰影處理。 真實感圖形學 真實感圖形學研究的是什麼?簡單來說,就是希望用計算機生成像照相機拍的照片一樣逼真地

深度學習Deep learning中的優化方法隨機梯度下降、受限的BFGS、共軛梯度法

  三種常見優化演算法:SGD(隨機梯度下降),LBFGS(受限的BFGS),CG(共軛梯度法)。      1.SGD(隨機梯度下降)        隨機梯度下降(Stochastic Gradient Descent, SGD)是隨機和優化相結合的產物,是一種很神奇的優化方法,屬於

多線程學習-基礎生產者消費者模型wait(),sleep(),notify()實現

都是 exce 生產 runnable 下午 util 庫存 jason 最大 一、多線程模型一:生產者消費者模型 (1)模型圖:(從網上找的圖,清晰明了) (2)生產者消費者模型原理說明:   這個模型核心是圍繞著一個“倉庫”的概念,生產者消費者都是圍繞著:“倉庫”