簡體   English   中英

Matmul有不同的級別

[英]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.tiletf.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)

它應該在tfnumpy的工作方式幾乎相同(在某些tf版本中不允許使用大寫索引,我看到了)。 雖然如果你以前從未見過這種表示法,這肯定超過了不可讀性的正則表達式。

對於其他人可能感興趣
我認為@phg的答案可能有用
但對我來說num h w是動態的,即None
因此, tf.einsum量流r1.0中的tf.einsum將引發誤差,因為在一個張量中存在多個None形狀

幸運的是,有一個問題拉請求
似乎可以處理有多個None形狀的情況
需要從源碼構建(主分支)
我將在重新構建tensorflow后報告結果

順便說一句,在tf.einsum只接受小寫

報告
是的,最新版本的tensorflow(主分支)接受tf.einsum動態形狀
使用tf.einsum后速度大大提升,非常棒

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM