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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

空间变换网络--spatial transform network

發布時間:2023/12/29 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 空间变换网络--spatial transform network 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
版權聲明:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/u011961856/article/details/77920970

CNN分類時,通常需要考慮輸入樣本的局部性、平移不變性、縮小不變性,旋轉不變性等,以提高分類的準確度。這些不變性的本質就是圖像處理的經典方法,即圖像的裁剪、平移、縮放、旋轉,而這些方法實際上就是對圖像進行空間坐標變換,我們所熟悉的一種空間變換就是仿射變換,圖像的仿射變換公式可以表示如下:

上式中,實現圖像的放大、縮小、平移、旋轉等。

那么,神經網絡是否有辦法,用一種統一的結構,自適應實現這些變換呢?本文提出了一種叫做空間變換網絡(Spatial Transform Networks, STN)的網絡模型,該網絡不需要關鍵點的標定,能夠根據分類或者其它任務自適應地將數據進行空間變換和對齊(包括平移、縮放、旋轉以及其它幾何變換等)。在輸入數據空間差異較大的情況下,這個網絡可以加在現有的卷積網絡中,提高分類的準確性。

本文所提的空間變換網絡的主要作用在于

1.可以將輸入變換為網絡的下一層期望的形式;

2.可以在訓練的過程中自動選擇感興趣的區域特征;

3.可以實現對各種形變的數據進行空間變換;

例如對于上圖中輸入手寫字體,我們感興趣的是黃色框中的包含數字的區域,那么在訓練的過程中,學習到的空間變換網絡會自動提取黃色框中的局部數據特征,并對框內的數據進行空間變換,得到輸出output。

2. 空間變換網絡原理詳解

所謂空間變換網絡,實際上是在神經網絡的某兩層之間引入一個空間變換網絡,該空間變換網絡包括兩個部分,網絡結構如下圖所示:

第一部分為為”localization net”,其用于生成仿射變換系絡結構進行設計,”localization net”網絡中的參數則為空間變換網絡需要訓練的參數;第二部分就是空間變換即仿射變換。通過該局部網絡產生仿射變換系數θθ后對U進行仿射變換的原理。

對于仿射變換,如果直接由仿射變換系數θθ大小的坐標位置點矩陣,接下來就是要對該坐標位置點進行仿射變換,仿射變換公式及示意圖如下:

需要注意的是,這時候的仿射系數為θθ的逆矩陣,經過仿射變換后可以得到V中的位置坐標點在U中對應的位置。但是,這時候求得的U中的坐標點仍然可能為非整數,因此通常需要進行插值得到對應的坐標點。得到U中的坐標點后,則可以將其復制到V中,從而得到仿射變換結果V。具體仿射變換過程,也可以結合下圖進行理解:

上圖中由Localisation Net生成仿射變換系數θθ后,仿射變換的過程是依次執行步驟1,2,3,4。

3. 空間變換網絡的實際應用

以上講解的是空間變換網絡的理解,那么在實際應用中,我們該如何添加空間變換網絡到我們自己的網絡中呢?接下來重點講解空間變換網絡的應用。

 3.1.空間變換網絡作為網絡的第一層

空間變換網絡可以直接作為網絡的第一層,即Localisation Net的輸入為input,從而直接對輸入進行仿射變換,對于Localisation Net的設計,可以根據輸入input的大小設計Localisation Net為全連接層或卷積層,例如對于手寫字體,輸入圖片大小為40x40,即input=[batch_size,1600],那么我們可以設計Localisation Net包含兩個全連接層,第一個全連接層w1=[1600,20],b1=[20],第一個全連接層w2=[20,6],b2=[6],則第二個全連接層的輸出為[batch_size,6],即為仿射變換系數。若輸入Localisation Net的input尺寸較大,則需要在Localisation Net中添加卷積和池化層,最后再輸入到全連接層,得到仿射變換系數;關于全連接層和卷積層的設計詳見參考代碼4.1,4.2。

 3.2.空間變換網絡插入CNN的中間層

空間變換網絡還可以添加在CNN的中間層,可以直接將空間變換網絡插入conv或者max-pooling層的前面或者后面。此外,還可以在CNN的同一層插入多個空間變換網絡,下面給出空間變換網絡插入CNN的手寫字體網絡結構圖:

上圖中第一個空間變換網絡ST1作用于輸入圖像,直接對輸入圖像進行空間變換,第二、三個空間變換網絡ST2a,ST2b作用于conv1,用于對第一層的卷積特征進行空間變換,而ST3用于對更深層的卷積特征進行空間變換。

由于空間變換網絡能夠自動提取局部區域特征,因此在網絡的同一層插入父哦個空間變換網絡可以提取多個局部區域特征,從而可以結合多個局部區域特征進行分類,如下如的網絡是實現兩張輸入的圖片中的手寫字體相加,在網絡的第一層插入兩層空間變換網絡ST1,ST2,并將其直接作用語輸入圖像。圖中第三列為空間變換結果,有圖可知,網絡ST1,ST2分別提取了輸入手寫字體的不同區域的特征。

4. 代碼分析

首先看一仿射變換的代碼實現,代碼的實現如上所述,首先由函數_meshgrid生成輸出V的坐標位置點grid,在通過仿射變換系數theta對grid進行仿射變換得到U中對于位置坐標點T_g,之后對T_g進行雙線性插值,并復制插值后的U中的坐標點的像素值到V中,得到輸出V。具體代碼實現如下:

def transform(theta, input_dim, out_size):with tf.variable_scope('_transform'):num_batch = tf.shape(input_dim)[0]height = tf.shape(input_dim)[1]width = tf.shape(input_dim)[2]num_channels = tf.shape(input_dim)[3]theta = tf.reshape(theta, (-1, 2, 3))theta = tf.cast(theta, 'float32')# grid of (x_t, y_t, 1), eq (1) in ref [1]height_f = tf.cast(height, 'float32')width_f = tf.cast(width, 'float32')out_height = out_size[0]out_width = out_size[1]grid = _meshgrid(out_height, out_width)grid = tf.expand_dims(grid, 0)grid = tf.reshape(grid, [-1])grid = tf.tile(grid, tf.pack([num_batch]))grid = tf.reshape(grid, tf.pack([num_batch, 3, -1]))#得到輸出坐標位置點# Transform A x (x_t, y_t, 1)^T -> (x_s, y_s)T_g = tf.batch_matmul(theta, grid)#仿射變換x_s = tf.slice(T_g, [0, 0, 0], [-1, 1, -1])#y_s = tf.slice(T_g, [0, 1, 0], [-1, 1, -1])x_s_flat = tf.reshape(x_s, [-1])y_s_flat = tf.reshape(y_s, [-1])input_transformed = _interpolate(input_dim, x_s_flat, y_s_flat,out_size)#插值,并得到輸出output = tf.reshape(input_transformed, tf.pack([num_batch, out_height, out_width, num_channels]))return output

接下來結合兩個具體的實例分別講解”localization net”的為全連接層和卷積層的設計。

(4.1)”localization net”的為全連接層的實例:

該示例中,空間變換網絡用于對輸入圖像進行變換處理,”localization net”包括兩個全連接層,具體網絡設計如下:

x = tf.placeholder(tf.float32, [None, 1600])#輸入y = tf.placeholder(tf.float32, [None, 10])x_tensor = tf.reshape(x, [-1, 40, 40, 1])W_fc_loc1 = weight_variable([1600, 20])#第一個全連接層b_fc_loc1 = bias_variable([20])W_fc_loc2 = weight_variable([20, 6])#第二個全連接層initial = np.array([[1., 0, 0], [0, 1., 0]])initial = initial.astype('float32')initial = initial.flatten()b_fc_loc2 = tf.Variable(initial_value=initial, name='b_fc_loc2')h_fc_loc1 = tf.nn.tanh(tf.matmul(x, W_fc_loc1) + b_fc_loc1)keep_prob = tf.placeholder(tf.float32)h_fc_loc1_drop = tf.nn.dropout(h_fc_loc1, keep_prob)h_fc_loc2 = tf.nn.tanh(tf.matmul(h_fc_loc1_drop, W_fc_loc2) + b_fc_loc2)#仿射變換系數theta,大小為bath_size*6out_size = (40, 40)h_trans = transformer(x_tensor, h_fc_loc2, out_size)

該代碼所示,該空間變換網絡部分需要訓練的參數即為”localization net”包括兩個全連接層的參數W_fc_loc1, b_fc_loc1,W_fc_loc2, b_fc_loc2。完整代碼鏈接如下:
https:\/\/github.com\/tensorflow\/models\/blob\/master\/transformer\/cluttered_mnist.py

(4.2)”localization net”的為卷積層的實例:

如以下代碼所示,該”localization net”層包括兩個卷積層,并包括兩個全連接層,得到仿射變換系數theta。

from keras.models import Sequential from keras.layers.core import Dense, Dropout, Activation, Flatten from keras.layers.convolutional import Convolution2D, MaxPooling2D#localization net,得到仿射變換系數thetalocnet = Sequential() locnet.add(MaxPooling2D(pool_size=(2,2), input_shape=input_shape))# locnet.add(Convolution2D(20, 5, 5)) locnet.add(MaxPooling2D(pool_size=(2,2))) locnet.add(Convolution2D(20, 5, 5))locnet.add(Flatten()) locnet.add(Dense(50)) locnet.add(Activation('relu')) locnet.add(Dense(6, weights=weights))#輸出仿射變換系數theta #locnet.add(Activation('sigmoid'))#build the modelmodel = Sequential() model.add(SpatialTransformer(localization_net=locnet,downsample_factor=3, input_shape=input_shape))#仿射變換model.add(Convolution2D(32, 3, 3, border_mode='same')) model.add(Activation('relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Convolution2D(32, 3, 3)) model.add(Activation('relu')) model.add(MaxPooling2D(pool_size=(2, 2)))model.add(Flatten()) model.add(Dense(256)) model.add(Activation('relu'))model.add(Dense(nb_classes)) model.add(Activation('softmax'))model.compile(loss='categorical_crossentropy', optimizer='adam')

該#localization net部分需要訓練的部分為locnet部分的每一層的系數,完整代碼鏈接如下:
(https://github.com/EderSantana/seya/blob/master/examples/Spatial%20Transformer%20Networks.ipynb)

總結

以上是生活随笔為你收集整理的空间变换网络--spatial transform network的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。