自注意力機制在圖像中的應用


筆者的畢設是做人臉圖像的補全,開始使用經典的變分自編碼器模型,能達到比較好的補全效果.后來看到BIGGAN的論文,里邊他們使用了self attention提高圖片生成的效果,查閱了相關資料后也在模型中加入了自注意力層,確實對補全后的圖像有了顯著的提升.當然了BIGGAN生成的圖片能達到以假亂真的地步也不光是靠加入了自注意力層,具體可以看http://www.twistedwg.com/2018/10/02/BigGAN.html這篇博客里對BIGGAN的解讀.本文主要分析為何加入自注意力層可以提高生成圖片的質量以及如何實現自注意力層.

BIGGAN將自注意力層加入到模型中主要是參考的Self Attention Gan(SAGAN),它將self attention layer 加入到GAN中,使得編碼器和解碼器能夠更好地對圖像不同區域的關系進行建模.

經典的DCGAN(Deep Convolutional GAN)采用多層卷積網絡構建編碼器和解碼器,但是這種網絡的表征能力受限於鄰域的 kernel size,就算后期感受野越來越大,終究還是局部區域的運算,這樣就忽略了全局其他片區(比如很遠的像素)對當前區域的貢獻。

在圖像領域,自注意力機制會學習某一像素點和其他所有位置(包括較遠位置)的像素點之間的關系,即捕獲long-range的關系.也就是說對於SAGAN,它會利用所有位置的特征來幫助生成圖片的某一細節,使生成的圖片更加逼真.

                        

 

對於SAGAN,首先對輸入的 feature map x 進行線性映射得到  f ,  g,  h, 其中 f(x) = Wf *x,  g(x) = Wg*x. 這兩個特征空間中的值將用來計算attention βj,i  = softmaxf(xi)g(xi))

                                                                                                                                                             

 

βj,i 用來表示ith位置對生成jth 區域的關系權重,N是特征位置的數目.將 h 與attention點乘得到注意力層的輸出結果o = (o1, o2, ..., oj ,...on)

                                                                                                                                            

 

                  

                                             SAGAN中的自注意力機制

                                                                                                                                           

 

其中Wf Wg W都是1×1的卷積, 最后將attention layer的結果乘以一個系數再加上原來的特征圖就是最后的結果 yi = xi + γoi. 其中γ是一個可學習的參數,在訓練過程中初始化為0,網絡在訓練初始階段主要依賴鄰域特征,之后慢慢的增大對對較遠區域依賴的權重.

 

BIGGAN實現的SelfAttention代碼如下

def hw_flatten(x) :
    return tf.reshape(x, shape=[x.shape[0], -1, x.shape[-1]])

def self_attention(x, channels, sn=False, scope='self_attention'):
    with tf.variable_scope(scope):
        f = conv(x, channels // 8, kernel=1, stride=1, scope='f_conv')  # [bs, h, w, c']
        g = conv(x, channels // 8, kernel=1, stride=1, scope='g_conv')  # [bs, h, w, c']
        h = conv(x, channels, kernel=1, stride=1, sn=sn, scope='h_conv')  # [bs, h, w, c]

        # N = h * w
        s = tf.matmul(hw_flatten(g), hw_flatten(f), transpose_b=True)  # # [bs, N, N]

        beta = tf.nn.softmax(s)  # attention map

        o = tf.matmul(beta, hw_flatten(h))  # [bs, N, C]
        gamma = tf.get_variable("gamma", [1], initializer=tf.constant_initializer(0.0))

        o = tf.reshape(o, shape=x.shape)  # [bs, h, w, C]
        x = gamma * o + x

    return x

 

reference -  "Self-Attention Generative Adversarial Networks"  Han Zhang,  Ian Goodfellow,  Dimitris Metaxas,  Augustus Odena, 2019

                   "Attention? Attention!"  Lilian Weng 

                   "綜述---圖像處理中的注意力機制"  https://blog.csdn.net/xys430381_1/article/details/89323444


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM