第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會有你想問的

循環(huán) np.einsum 很多次......有更快的方法嗎?

循環(huán) np.einsum 很多次......有更快的方法嗎?

白板的微信 2023-03-08 15:48:30
我有一個(gè)似然函數(shù),我正在嘗試使用 MCMC 對其進(jìn)行采樣。我在對數(shù)似然本身中沒有使用 for 循環(huán),但我確實(shí)調(diào)用了np.einsum()一次。這是我當(dāng)前代碼的示例:A = np.random.rand(4,50,60,200) # Random NDarrayB = np.random.rand(200,1000,4)  # Random NDarrayout = np.einsum('ijkl,lui->jkui', A, B, optimize="optimal")輸出out具有維度 (50,60,1000,4)。這個(gè)計(jì)算有點(diǎn)太慢,無法進(jìn)行有效的 MCMC 采樣(在我的機(jī)器上大約 4 秒),有什么辦法可以加快速度嗎?一條有用的信息是,對于對數(shù)似然函數(shù)的每次調(diào)用,雖然數(shù)組 A 和 B 中的實(shí)際值在變化,但每個(gè)數(shù)組的維度保持不變。我想這可能有助于加快速度,因?yàn)橄嗤脑乜偸窍喑恕?
查看完整描述

2 回答

?
守著一只汪

TA貢獻(xiàn)1872條經(jīng)驗(yàn) 獲得超4個(gè)贊

好吧,其中一個(gè)軸在A(第一個(gè))和B(最后一個(gè))中保持對齊,并且也保持在輸出中(最后一個(gè))并且是一個(gè)非常小的循環(huán)數(shù)4。因此,我們可以簡單地循環(huán)使用 withnp.tensordot來減少張量和。4x在處理如此大的數(shù)據(jù)集時(shí),減少內(nèi)存擁塞的好處可能會克服 4 倍循環(huán),因?yàn)槊看蔚挠?jì)算量也4x更少。


因此,一個(gè)解決方案tensordot是 -


def func1(A, B):

    out = np.empty(A.shape[1:3] + B.shape[1:])

    for i in range(len(A)):

        out[...,i] = np.tensordot(A[i], B[...,i],axes=(-1,0))

    return out

時(shí)間 -


In [70]: A = np.random.rand(4,50,60,200) # Random NDarray

    ...: B = np.random.rand(200,1000,4)  # Random NDarray

    ...: out = np.einsum('ijkl,lui->jkui', A, B, optimize="optimal")


# Einsum solution without optimize    

In [71]: %timeit np.einsum('ijkl,lui->jkui', A, B)

2.89 s ± 109 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)


# Einsum solution with optimize    

In [72]: %timeit np.einsum('ijkl,lui->jkui', A, B, optimize="optimal")

2.79 s ± 9.31 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)    


# @Paul Panzer's soln

In [74]: %timeit np.stack([np.tensordot(a,b,1) for a,b in zip(A,B.transpose(2,0,1))],-1)

183 ms ± 6.08 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)


In [73]: %timeit func1(A,B)

158 ms ± 3.35 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

只是為了重申內(nèi)存擁塞和計(jì)算要求的重要性,假設(shè)我們也想求和減少最后一個(gè)長度軸4,那么我們將看到版本時(shí)間上的顯著差異optimal-


In [78]: %timeit np.einsum('ijkl,lui->jkui', A, B, optimize="optimal")

2.76 s ± 9.36 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)


In [79]: %timeit np.einsum('ijkl,lui->jku', A, B, optimize="optimal")

93.8 ms ± 3.3 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

因此,在這種情況下,最好使用einsum.


具體到給定的問題

鑒于A和 的維度B保持不變,數(shù)組初始化out = np.empty(A.shape[1:3] + B.shape[1:])可以作為一次性事件完成,并循環(huán)遍歷對數(shù)似然函數(shù)的每次調(diào)用,并建議循環(huán)使用tensordot和更新輸出out。


查看完整回答
反對 回復(fù) 2023-03-08
?
神不在的星期二

TA貢獻(xiàn)1963條經(jīng)驗(yàn) 獲得超6個(gè)贊

即使在小循環(huán)中使用也tensordot快 10 倍以上:


timeit(lambda:np.einsum('ijkl,lui->jkui', A, B, optimize="optimal"),number=5)/5

# 3.052245747600682

timeit(lambda:np.stack([np.tensordot(a,b,1) for a,b in zip(A,B.transpose(2,0,1))],-1),number=10)/10

# 0.23842503569903784


out_td = np.stack([np.tensordot(a,b,1) for a,b in zip(A,B.transpose(2,0,1))],-1)

out_es = np.einsum('ijkl,lui->jkui', A, B, optimize="optimal")

np.allclose(out_td,out_es)

# True


查看完整回答
反對 回復(fù) 2023-03-08
  • 2 回答
  • 0 關(guān)注
  • 169 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號