bilinear cnn中的計算
阿新 • • 發佈:2021-01-26
技術標籤:深度學習知識
在看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]])
按照這樣的計算可知,其獲得的是不同通道之間的相互關係,也就是協方差矩陣。