[英]Matmul with different rank
我有3個張量
X
形(1, c, h, w)
,假設(1, 20, 40, 50)
Fx
形狀(num, w, N)
,假設(1000, 50, 10)
Fy
形狀(num, N, h)
,假設(1000, 10, 40)
我想做的是Fy * (X * Fx)
( *
表示matmul
)
X * Fx
形狀(num, c, h, N)
,假設(1000, 20, 40, 10)
Fy * (X * Fx)
形狀(num, c, N, N)
,假設(1000, 20, 10, 10)
我正在使用tf.tile
和tf.expand_dims
來完成它
但我認為它使用了大量內存( tile
復制數據對嗎?),而且速度慢
試着找到更好的方式,更快,並使用小內存來完成
# X: (1, c, h, w)
# Fx: (num, w, N)
# Fy: (num, N, h)
X = tf.tile(X, [tf.shape(Fx)[0], 1, 1, 1]) # (num, c, h, w)
Fx_ex = tf.expand_dims(Fx, axis=1) # (num, 1, w, N)
Fx_ex = tf.tile(Fx_ex, [1, c, 1, 1]) # (num, c, w, N)
tmp = tf.matmul(X, Fxt_ex) # (num, c, h, N)
Fy_ex = tf.expand_dims(Fy, axis=1) # (num, 1, N, h)
Fy_ex = tf.tile(Fy_ex, [1, c, 1, 1]) # (num, c, N, h)
res = tf.matmul(Fy_ex, tmp) # (num, c, N, N)
我想是一個神話般的einsum
案例:
>>> import numpy as np
>>> X = np.random.rand(1, 20, 40, 50)
>>> Fx = np.random.rand(100, 50, 10)
>>> Fy = np.random.rand(100, 10, 40)
>>> np.einsum('nMh,uchw,nwN->ncMN', Fy, X, Fx).shape
(100, 20, 10, 10)
它應該在tf
和numpy
的工作方式幾乎相同(在某些tf
版本中不允許使用大寫索引,我看到了)。 雖然如果你以前從未見過這種表示法,這肯定超過了不可讀性的正則表達式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.