日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Spatial Transformer Networks(STN)详解

發(fā)布時(shí)間:2023/12/15 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spatial Transformer Networks(STN)详解 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

    • 1、STN的作用
        • 1.1 靈感來源
        • 1.2 什么是STN?
    • 2、STN網(wǎng)絡(luò)架構(gòu)![在這里插入圖片描述](https://img-blog.csdnimg.cn/20190908104416274.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1daWjE4MTkxMTcxNjYx,size_16,color_FFFFFF,t_70#pic_center)
    • 3、Localisation net是如何實(shí)現(xiàn)參數(shù)的選取的?
        • 3.1 如何實(shí)現(xiàn)平移變換
        • 3.2 如何實(shí)現(xiàn)縮放變換
        • 3.3 如何實(shí)現(xiàn)旋轉(zhuǎn)變換
        • 3.4 如何實(shí)現(xiàn)裁剪變換
        • 3.5 總結(jié)
    • 4、Grid generator如何實(shí)現(xiàn)像素點(diǎn)坐標(biāo)的對(duì)應(yīng)關(guān)系?
        • 4.1 為什么會(huì)有坐標(biāo)的問題?
        • 4.2 仿射變換關(guān)系
    • 5、Sampler實(shí)現(xiàn)坐標(biāo)求解的可微性
        • 5.1 小數(shù)坐標(biāo)問題的提出
        • 5.2 解決輸出坐標(biāo)為小數(shù)的問題
        • 5.3 Sampler的數(shù)學(xué)原理
    • 6、Spatial Transformer Networks(STN)
    • 7、STN 代碼實(shí)現(xiàn)
    • 參考資料
    • 注意事項(xiàng)

1、STN的作用

1.1 靈感來源

??普通的CNN能夠顯示的學(xué)習(xí)平移不變性,以及隱式的學(xué)習(xí)旋轉(zhuǎn)不變性,但attention model 告訴我們,與其讓網(wǎng)絡(luò)隱式的學(xué)習(xí)到某種能力,不如為網(wǎng)絡(luò)設(shè)計(jì)一個(gè)顯式的處理模塊,專門處理以上的各種變換。因此,DeepMind就設(shè)計(jì)了Spatial Transformer Layer,簡稱STL來完成這樣的功能。

1.2 什么是STN?

??關(guān)于平移不變性 ,對(duì)于CNN來說,如果移動(dòng)一張圖片中的物體,那應(yīng)該是不太一樣的。假設(shè)物體在圖像的左上角,我們做卷積,采樣都不會(huì)改變特征的位置,糟糕的事情在我們把特征平滑后后接入了全連接層,而全連接層本身并不具備 平移不變性 的特征。但是 CNN 有一個(gè)采樣層,假設(shè)某個(gè)物體移動(dòng)了很小的范圍,經(jīng)過采樣后,它的輸出可能和沒有移動(dòng)的時(shí)候是一樣的,這是 CNN 可以有小范圍的平移不變性 的原因。

??如上圖所示,如果是手寫數(shù)字識(shí)別,圖中只有一小塊是數(shù)字,其他大部分地區(qū)都是黑色的,或者是小噪音。假如要識(shí)別,用Transformer Layer層來對(duì)圖片數(shù)據(jù)進(jìn)行旋轉(zhuǎn)縮放,只取其中的一部分,放到之后然后經(jīng)過CNN就能識(shí)別了。我們發(fā)現(xiàn),它其實(shí)也是一個(gè)layer,放在了CNN的前面,用來轉(zhuǎn)換輸入的圖片數(shù)據(jù),其實(shí)也可以轉(zhuǎn)換feature map,因?yàn)閒eature map說白了就是濃縮的圖片數(shù)據(jù),所以Transformer layer也可以放到CNN里面。

2、STN網(wǎng)絡(luò)架構(gòu)

??上圖是Spatial Transformer Networks的網(wǎng)絡(luò)結(jié)構(gòu),它主要由3部分組成,它們的功能和名稱如下:參數(shù)預(yù)測:Localisation net、坐標(biāo)映射:Grid generator、像素的采集:Sampler。

??上圖展示了一個(gè)平移變換的過程,也就是STN所做的事情。假設(shè)左邊是Layer l?1的輸出,也就是STN的輸入,最右邊為變換后的結(jié)果。假設(shè)是一個(gè)全連接層,n,m代表輸出的值在輸出矩陣中的下標(biāo),輸入的值通過權(quán)值w,做一個(gè)組合,完成這樣的變換。
??假如要生成a11la_{11}^{l}a11l?,那就是將左邊矩陣的九個(gè)輸入元素,全部乘以一個(gè)權(quán)值,加權(quán)相加:a11l=w1111la11l?1+w1112la12l?1+w1113la13l?1+?+w1133la33l?1a_{11}^{l}=w_{1111}^{l} a_{11}^{l-1}+w_{1112}^{l} a_{12}^{l-1}+w_{1113}^{l} a_{13}^{l-1}+\cdots+w_{1133}^{l} a_{33}^{l-1}a11l?=w1111l?a11l?1?+w1112l?a12l?1?+w1113l?a13l?1?+?+w1133l?a33l?1?。這僅僅是a11la_{11}^{l}a11l?的值,其他的結(jié)果也是這樣算出來的,具體的計(jì)算公式如下所示:anml=∑i=13∑j=13wnm,ijlaijl?1a_{n m}^{l}=\sum_{i=1}^{3} \sum_{j=1}^{3} w_{n m, i j}^{l} a_{i j}^{l-1}anml?=i=13?j=13?wnm,ijl?aijl?1?通過調(diào)整這些權(quán)值,就可以達(dá)到縮放和平移的目的,其實(shí)這就是變換的基本思路。在整個(gè)的變換過程中,會(huì)涉及到3個(gè)關(guān)鍵的問題需要去解決,具體的問題如下所示:

  • 問題1-應(yīng)該如何確定這些參數(shù)?
  • 問題2-圖片的像素點(diǎn)可以當(dāng)成坐標(biāo),在平移過程中怎么實(shí)現(xiàn)原圖片與平移后圖片的坐標(biāo)映射關(guān)系?
  • 問題3-參數(shù)調(diào)整過程中,權(quán)值一定不可能都是整數(shù),那輸出的坐標(biāo)有可能是小數(shù),但實(shí)際坐標(biāo)都是整數(shù)的,如果實(shí)現(xiàn)小數(shù)與整數(shù)之間的連接?

3、Localisation net是如何實(shí)現(xiàn)參數(shù)的選取的?

3.1 如何實(shí)現(xiàn)平移變換


??對(duì)于平移變換而言,比如從a11l?1a_{11}^{l-1}a11l?1?平移到a21la_{21}^{l}a21l?,得到的a21la_{21}^{l}a21l?可以使用下式來表示:a21l=w2111la11l?1+w2112la12l?1+w2113la13l?1+?+w2133la33l?1a_{21}^{l}=w_{2111}^{l} a_{11}^{l-1}+w_{2112}^{l} a_{12}^{l-1}+w_{2113}^{l} a_{13}^{l-1}+\cdots+w_{2133}^{l} a_{33}^{l-1} a21l?=w2111l?a11l?1?+w2112l?a12l?1?+w2113l?a13l?1?+?+w2133l?a33l?1?,當(dāng)w2111l=1w_{2111}^{l}=1w2111l?=1,其余均為0時(shí),上式則可以簡化為:a21l=1?a11l11a_{21}^{l}=1 * a_{11}^{l_{1} 1} a21l?=1?a11l1?1?,這樣就完成了整個(gè)平移變換,其它的平移也可以使用類似的方法來獲得。

3.2 如何實(shí)現(xiàn)縮放變換

??如果想要放大一張圖片,只需要在X軸和Y軸方向上同時(shí)X2就可以啦,這樣就可以達(dá)到放大的效果。上述過程可以用下圖中的矩陣表達(dá)式來表示??s小圖片的原理和放大圖片的原理很相似,具體的實(shí)現(xiàn)細(xì)節(jié)請(qǐng)看下圖。

3.3 如何實(shí)現(xiàn)旋轉(zhuǎn)變換

??一個(gè)圓圈的角度是360度,我們可以通過控制水平和豎直兩個(gè)方向來實(shí)現(xiàn)旋轉(zhuǎn)。

由點(diǎn)A旋轉(zhuǎn)θ度角,到達(dá)點(diǎn)B.得到下式:x′=Rcos?αy′=Rsin?α\begin{array}{l}{x^{\prime}=R \cos \alpha} \\ {y^{\prime}=R \sin \alpha}\end{array} x=Rcosαy=Rsinα? 由A點(diǎn)可得下式:x=Rcos?(α+θ)y=Rsin?(α+θ)\begin{array}{l}{x=R \cos (\alpha+\theta)} \\ {y=R \sin (\alpha+\theta)}\end{array} x=Rcos(α+θ)y=Rsin(α+θ)? 將上式展開可得:x=Rcos?αcos?θ?Rsin?αsin?θy=Rsin?αcos?θ+Rcos?αsin?θ\begin{array}{l}{x=R \cos \alpha \cos \theta-R \sin \alpha \sin \theta} \\ {y=R \sin \alpha \cos \theta+R \cos \alpha \sin \theta}\end{array} x=Rcosαcosθ?Rsinαsinθy=Rsinαcosθ+Rcosαsinθ? 把未知數(shù)α替換掉可得下式:x=x′cos?θ?y′sin?θy=y′cos?θ+x′sin?θ\begin{aligned} x &=x^{\prime} \cos \theta-y^{\prime} \sin \theta \\ y &=y^{\prime} \cos \theta+x^{\prime} \sin \theta \end{aligned} xy?=xcosθ?ysinθ=ycosθ+xsinθ? 總而言之,我們可以簡單的理解為cosθ,sinθ就是控制這樣的方向的,把它當(dāng)成權(quán)值參數(shù),寫成矩陣形式,就完成了旋轉(zhuǎn)操作。

3.4 如何實(shí)現(xiàn)裁剪變換

??剪切變換相當(dāng)于將圖片沿x和y兩個(gè)方向拉伸,且x方向拉伸長度與y有關(guān),y方向拉伸長度與x有關(guān),用矩陣形式表示前切變換如下:

3.5 總結(jié)

??通過上面的分析,我們發(fā)現(xiàn)所有的這些操作,只需要六個(gè)參數(shù)[2X3]就可以實(shí)現(xiàn)各種變換功能啦,所以我們可以把feature map U作為輸入,過連續(xù)若干層計(jì)算(如卷積、FC等),回歸出參數(shù)θ,在我們的例子中就是一個(gè)[2,3]大小的6維仿射變換參數(shù),用于下一步計(jì)算。

4、Grid generator如何實(shí)現(xiàn)像素點(diǎn)坐標(biāo)的對(duì)應(yīng)關(guān)系?

4.1 為什么會(huì)有坐標(biāo)的問題?

??由上面的公式,我們可以發(fā)現(xiàn),無論如何做旋轉(zhuǎn),縮放,平移,只用到六個(gè)參數(shù)就可以了,具體如下圖所示:

??縮放的本質(zhì),其實(shí)就是在原樣本上面進(jìn)行采樣,獲得對(duì)應(yīng)的像素點(diǎn),通俗點(diǎn)說,就是輸出的圖片(i,j)的位置上,要對(duì)應(yīng)輸入圖片的哪個(gè)位置?

??如圖所示旋轉(zhuǎn)縮放操作,我們把像素點(diǎn)看成是坐標(biāo)中的一個(gè)小方格,輸入的圖片U∈RHxWxCU \in R^{H x W x C}URHxWxC可以是一張圖片,或者feature map,其中H表示高,W表示寬,C表示顏色通道。經(jīng)過變換Tθ(G)T_{\theta}(G)Tθ?(G),θ是上一個(gè)部分(Localisation net)生成的參數(shù),生成了圖片V∈RH′xW′xCV \in R^{H^{\prime} x W^{\prime} x C}VRHxWxC,它的像素相當(dāng)于被貼在了圖片的固定位置上,用G=GiG=G_{i}G=Gi?表示,像素點(diǎn)的位置可以表示為Gi={xit,yit}G_{i}=\left\{x_{i}^{t}, y_{i}^{t}\right\}Gi?={xit?,yit?},這就是我們?cè)谶@一階段要確定的坐標(biāo)。

4.2 仿射變換關(guān)系


??上圖展示的是一個(gè)坐標(biāo)轉(zhuǎn)換變換關(guān)系:其中(xit,yit)\left(x_{i}^{t}, y_{i}^{t}\right)(xit?,yit?)表示的是輸出目標(biāo)圖片的坐標(biāo),(xis,yis)\left(x_{i}^{s}, y_{i}^{s}\right)(xis?,yis?)表示原圖片的坐標(biāo),AθA_{\theta}Aθ?表示仿射關(guān)系。我們的仿射變換關(guān)系是:從目標(biāo)圖片------->原圖片。作者在論文中寫的比較模糊,比較滿意的解釋是坐標(biāo)映射的作用,其實(shí)是讓目標(biāo)圖片在原圖片上采樣,每次從原圖片的不同坐標(biāo)上采集像素到目標(biāo)圖片上,而且要把目標(biāo)圖片貼滿,每次目標(biāo)圖片的坐標(biāo)都要遍歷一遍,是固定的,而采集的原圖片的坐標(biāo)是不固定的,因此用這樣的映射。

??如圖所示,假設(shè)只有平移變換,這個(gè)過程就相當(dāng)于一個(gè)拼圖的過程,左圖是一些像素點(diǎn),右圖是我們的目標(biāo),我們的目標(biāo)是確定的,目標(biāo)圖的方框是確定的,圖像也是確定的,這就是我們的目標(biāo),我們要從左邊的小方塊中拿一個(gè)小方塊放在右邊的空白方框上,因?yàn)橐婚_始右邊的方框是沒有圖的,只有坐標(biāo),為了確定拿過來的這個(gè)小方塊應(yīng)該放在哪里,我們需要遍歷一遍右邊這個(gè)方框的坐標(biāo),然后再?zèng)Q定應(yīng)該放在哪個(gè)位置。所以每次從左邊拿過來的方塊是不固定的,而右邊待填充的方框卻是固定的,所以定義從目標(biāo)圖片------->原圖片的坐標(biāo)映射關(guān)系更加合理,且方便。

5、Sampler實(shí)現(xiàn)坐標(biāo)求解的可微性

5.1 小數(shù)坐標(biāo)問題的提出

??我們可以假設(shè)一下我們的權(quán)值矩陣的參數(shù)是如下這幾個(gè)數(shù),x,y分別表示的是他們的下標(biāo),經(jīng)過變換后,可以得到如下的變換關(guān)系。

前面舉的例子中,權(quán)值都是整數(shù),計(jì)算的結(jié)果也必定是整數(shù),如果不是整數(shù)呢?

假如權(quán)值是小數(shù),那得到的值也一定是小數(shù),1.6,2.4,但是沒有元素的下標(biāo)索引是小數(shù)呀。那不然取最近吧,那就得到2,2了,也就是與a22la_{22}^{l}a22l?對(duì)應(yīng)了。

5.2 解決輸出坐標(biāo)為小數(shù)的問題

??使用上面的四舍五入顯然是不能進(jìn)行梯度下降來回傳梯度的。由于梯度下降是一步一步調(diào)整的,而且調(diào)整的數(shù)值都比較小,哪怕權(quán)值參數(shù)有小范圍的變化,雖然最后的輸出也會(huì)有小范圍的變化,比如一步迭代后,結(jié)果有:1.6→1.64,2.4→2.38。但是即使有這樣的改變,結(jié)果依然是a22l1→a22la_{22}^{l_{1}} \rightarrow a_{22}^{l}a22l1??a22l?的對(duì)應(yīng)關(guān)系沒有一點(diǎn)變化,所以output依然沒有變,我們沒有辦法微分了,也就是梯度依然為0呀,梯度為0就沒有可學(xué)習(xí)的空間呀。所以我們需要做一個(gè)小小的調(diào)整。
??仔細(xì)思考一下這個(gè)問題是什么造成的,我們發(fā)現(xiàn)其實(shí)在推導(dǎo)SVM的時(shí)候,我們也遇到過相同的問題,當(dāng)時(shí)我們?nèi)绻皇怯涗浤切┏鼋绲狞c(diǎn)的個(gè)數(shù),好像也是不能求梯度的,當(dāng)時(shí)我們是用了hing loss,來計(jì)算一下出界點(diǎn)到邊界的距離,來優(yōu)化那個(gè)距離的,我們這里也類似,我們可以計(jì)算一下到輸出[1.6,2.4]附近的主要元素,如下所示,計(jì)算一下輸出的結(jié)果與他們的下標(biāo)的距離,可得:

然后做如下更改:

他們對(duì)應(yīng)的權(quán)值都是與結(jié)果對(duì)應(yīng)的距離相關(guān)的,如果目標(biāo)圖片發(fā)生了小范圍的變化,這個(gè)式子也是可以捕捉到這樣的變化的,這樣就能用梯度下降法來優(yōu)化了。

5.3 Sampler的數(shù)學(xué)原理

??論文作者對(duì)我們前面的過程給出了非常嚴(yán)密的證明過程,以下是我對(duì)論文的轉(zhuǎn)述。每次變換,相當(dāng)于從原圖片(xis,yis)\left(x_{i}^{s}, y_{i}^{s}\right)(xis?,yis?)中,經(jīng)過仿射變換,確定目標(biāo)圖片的像素點(diǎn)坐標(biāo)(xit,yit)\left(x_{i}^{t}, y_{i}^{t}\right)(xit?,yit?)的過程,這個(gè)過程可以用公式表示為:

kernel k表示一種線性插值方法,比如雙線性插值,更詳細(xì)的請(qǐng)參考該鏈接,?x,?y\phi_{x}, \phi_{y}?x?,?y?表示插值函數(shù)的參數(shù);UnmcU_{n m}^{c}Unmc?表示位于顏色通道C中坐標(biāo)為(n,m)的值。
如果使用雙線性插值,則可以使用下式來表示:

為了允許反向傳播回傳損失,我們可以求對(duì)該函數(shù)求偏導(dǎo):

對(duì)于yisy_{i}^{s}yis?的偏導(dǎo)也類似,如果就能實(shí)現(xiàn)這一步的梯度計(jì)算,而對(duì)于=?xis?θ,?yis?θ=\frac{\partial x_{i}^{s}}{\partial \theta}, \frac{\partial y_{i}^{s}}{\partial \theta}=?θ?xis??,?θ?yis??的求解也很簡單,所以整個(gè)過程按照Localisation net←Grid generator←Sampler的梯度回傳就能走通了。

6、Spatial Transformer Networks(STN)


??將這三個(gè)組塊結(jié)合起來,就構(gòu)成了完整STN網(wǎng)絡(luò)結(jié)構(gòu)了。這個(gè)網(wǎng)絡(luò)可以加入到CNN的任意位置,而且相應(yīng)的計(jì)算量也很少。將 spatial transformers 模塊集成到 cnn 網(wǎng)絡(luò)中,允許網(wǎng)絡(luò)自動(dòng)地學(xué)習(xí)如何進(jìn)行 feature_map 的轉(zhuǎn)變,從而有助于降低網(wǎng)絡(luò)訓(xùn)練中整體的代價(jià)。定位網(wǎng)絡(luò)中輸出的值,指明了如何對(duì)每個(gè)訓(xùn)練數(shù)據(jù)進(jìn)行轉(zhuǎn)化。

7、STN 代碼實(shí)現(xiàn)

STN結(jié)構(gòu)示例如下所示:

class STN(nn.HybridBlock):##繼承HybridBlock模塊,可以方便的hybrid,將命令式編程轉(zhuǎn)換為符號(hào)式提升性能但損失了一定的靈活性def __init__(self):super(STN, self).__init__()with self.name_scope():# 使用name_scope可以自動(dòng)給每一層生成獨(dú)一無二的名字方便讀取特定層# Spatial transformer localization-network# loc 定義了兩層卷積網(wǎng)絡(luò)loc = self.localization = nn.HybridSequential() loc.add(nn.Conv2D(8, kernel_size=7))loc.add(nn.MaxPool2D(strides=2))loc.add(nn.Activation(activation='relu'))loc.add(nn.Conv2D(10, kernel_size=5))loc.add(nn.MaxPool2D(strides=2))loc.add(nn.Activation(activation='relu'))# 采用兩層全連接層,回歸出仿射變換所需的參數(shù)θ(6,) # Regressor for the 3 * 2 affine matrixfc_loc = self.fc_loc = nn.HybridSequential()fc_loc.add(nn.Dense(32,activation='relu'))# 將該層w初始化為全零,b初始化為[1,0,0,0,1,0]fc_loc.add(nn.Dense(3 * 2,weight_initializer='zeros'))# Spatial transformer network forward function# 使用hybrid_forward需要增加F參數(shù),它會(huì)自動(dòng)判定前向過程中調(diào)用nd還是sym def hybrid_forward(self,F, x): xs = self.localization(x)xs = xs.reshape((-1, 10 * 3 * 3))theta = self.fc_loc(xs)theta = theta.reshape((-1, 2*3))# MxNet 已經(jīng)定義好了相應(yīng)的產(chǎn)生網(wǎng)格和采樣的函數(shù)接口grid = F.GridGenerator(data=theta, transform_type='affine',target_shape=(28,28),name='grid')x = F.BilinearSampler(data=x,grid=grid,name='sampler' )return x

主體網(wǎng)絡(luò)代碼如下所示:

class Net(nn.HybridBlock):def __init__(self):super(Net, self).__init__()# 對(duì)輸入圖片進(jìn)行STN變換后送入一個(gè)簡單的兩層卷積,兩層全連接網(wǎng)絡(luò)with self.name_scope():self.model = nn.HybridSequential()self.model.add(STN())self.model.add(nn.Conv2D(10, kernel_size=5))self.model.add(nn.MaxPool2D())self.model.add(nn.Activation(activation='relu'))self.model.add(nn.Conv2D(20, kernel_size=5))self.model.add(nn.Dropout(.5))self.model.add(nn.MaxPool2D())self.model.add(nn.Activation(activation='relu'))self.model.add(nn.Flatten())self.model.add(nn.Dense(50))self.model.add(nn.Activation(activation='relu'))self.model.add(nn.Dropout(.5))self.model.add(nn.Dense(10))def hybrid_forward(self,F, x):for i,b in enumerate(self.model):x = b(x)return x

參考資料

[1] STN論文
[2] 參考博客1
[3] 參考博客2

注意事項(xiàng)

[1] 該博客轉(zhuǎn)載自該博客;
[2] 由于個(gè)人能力有限,該博客可能存在很多的問題,希望大家能夠提出改進(jìn)意見。
[3] 如果您在閱讀本博客時(shí)遇到不理解的地方,希望您可以聯(lián)系我,我會(huì)及時(shí)的回復(fù)您,和您交流想法和意見,謝謝。
[4] 本人業(yè)余時(shí)間承接各種本科畢設(shè)設(shè)計(jì)和各種小項(xiàng)目,包括圖像處理(數(shù)據(jù)挖掘、機(jī)器學(xué)習(xí)、深度學(xué)習(xí)等)、matlab仿真、python算法及仿真等,有需要的請(qǐng)加QQ:1575262785詳聊,備注“項(xiàng)目”!!!

總結(jié)

以上是生活随笔為你收集整理的Spatial Transformer Networks(STN)详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。