我有3张
X
形状(1, c, h, w)
,假设(1, 20, 40, 50)
Fx
形状(num, w, N)
,假设(1000, 50, 10)
Fy
形状(num, N, h)
,假设(1000, 10, 40)
MATMUL不同等级
我想要做的就是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)
是的,我从来没有见过这个,有点难以理解,想了解这个想法 – xxi
awwwwwesome,它巨大的速度提高,非常感谢 – xxi