1. 程式人生 > 其它 >bilinear cnn中的計算

bilinear cnn中的計算

技術標籤:深度學習知識

在看bilinear cnn論文時,文章中描述經過兩個網路分別得到的兩個特徵圖,假設形狀均為355,對兩個特徵圖相同位置的31的特徵向量作外積,得到33的矩陣,而特徵圖有55=25個位置,因此有25個這樣的33矩陣,之後採用sum_pooling,也就是25個矩陣對應位置相加,最終得到的矩陣打為一維,後經過有符號的開根號、L2 normalization進行SVM判斷。具體計算如下所示:
在這裡插入圖片描述
此計算的效果等同於將兩個355的特徵圖轉為325的特徵圖,之後兩個325的特徵圖作外積,得到的效果與上面的效果相同。
程式碼如下:

import torch

if __name__==
"__main__": x = torch.randn((3, 5, 5)) cor_sum = 0 for i in range(5): for j in range(5): vec = torch.unsqueeze(x[:, i, j], dim=1) cor = vec @ vec.transpose(1, 0) cor_sum = cor_sum + cor print(cor_sum) x = x.reshape(3, -1) Cor_sum =
x @ x.transpose(1, 0) print(Cor_sum)
tensor([[29.2531,  0.0474, -4.7499],
        [ 0.0474, 20.0788, -3.6187],
        [-4.7499, -3.6187, 17.9660]])
tensor([[29.2531,  0.0474, -4.7499],
        [ 0.0474, 20.0788, -3.6187],
        [-4.7499, -3.6187, 17.9660]])

按照這樣的計算可知,其獲得的是不同通道之間的相互關係,也就是協方差矩陣。