ผลิตภัณฑ์เทนเซอร์ตลก Numpy/PyTorch

ฉันมีพารามิเตอร์เทนเซอร์คบเพลิง 4 มิติที่กำหนดดังนี้:

nn.parameter.Parameter(data=torch.Tensor((13,13,13,13)), requires_grad=True)

และเทนเซอร์สี่ตัวพร้อมสลัว (batch_size,13) (หรือเทนเซอร์หนึ่งตัวพร้อมสลัว (batch_size,4,13)) อยากได้เทนเซอร์ที่มี dims (batch_size) เท่ากับสูตรท้ายภาพนี้ : [แก้ไข: รูปแรกผมทำผิด แก้ไขให้แล้ว] ป้อนคำอธิบายรูปภาพที่นี่ ฉันเคยเห็นในเอกสารประกอบของ torch เกี่ยวกับฟังก์ชัน tensordot แต่ฉันไม่สามารถทำให้มันทำงานได้ด้วยตัวเอง


person Jogima_cyber    schedule 19.01.2021    source แหล่งที่มา
comment
เพียงเพื่อให้แน่ใจว่าคุณกำลังจัดทำดัชนีเอาต์พุต B ของคุณด้วย i แต่มันแตกต่างจากตัวแปรปิดเสียงที่คุณดำเนินการผลรวมนอกสุดใช่ไหม   -  person trialNerror    schedule 20.01.2021
comment
result = (A[None, :, :, :, :] * X[:, :, None, None, None] * Y[:, None, :, None, None] * Z[:, None, None, :, None] * T[:, None, None, None, :]).flatten(1).sum(dim=1)เป็นสิ่งที่คุณต้องการใช่ไหม? ถ้าเป็นเช่นนั้นฉันสามารถโพสต์คำตอบพร้อมคำอธิบายได้   -  person jodag    schedule 20.01.2021
comment
เหตุผลเดียวที่ฉันสับสนและไม่โพสต์เป็นคำตอบคือการใช้ตัวห้อย i ทางด้านซ้ายและด้านขวาของสมการที่คุณโพสต์   -  person jodag    schedule 20.01.2021
comment
@trialNerror ฉันได้แก้ไขรูปภาพของฉันแล้ว และคุณพูดถูก ฉันต้องเพิ่มตัวแปร b สำหรับองค์ประกอบแบตช์   -  person Jogima_cyber    schedule 20.01.2021
comment
@jodag ฉันไม่แน่ใจว่านี่คือสิ่งที่ฉันพยายามทำเนื่องจาก X, Y, Z และ T ในสมการของคุณเป็นเทนเซอร์ของ dims 5 แต่ทุ่นระเบิดเป็นเทนเซอร์ของ dims 2   -  person Jogima_cyber    schedule 20.01.2021
comment
ถ้า A เป็นเทนเซอร์ของ dims 3 ฉันก็สามารถทำได้ด้วย torch.bmm(torch.unsqueeze(z,2),torch.bmm(torch.unsqueeze(y,1),torch.transpose(torch.matmul( x,A),0,1))).sum(แกน=2).sum(แกน=1)   -  person Jogima_cyber    schedule 20.01.2021
comment
@Jogima_cyber No A เป็น 4 มิติและ X, Y, Z และ T เป็น 2 มิติตามที่คุณระบุในรูปภาพของคุณ การจัดทำดัชนี None ใช้เพื่อแทรกมิติข้อมูลแบบรวมเช่นเดียวกับตัวเลข นี่เป็นการออกอากาศที่เทียบเท่ากับสำนวน einsum ของคำตอบของ Shai   -  person jodag    schedule 20.01.2021


คำตอบ (1)


เมื่อใดก็ตามที่คุณมีผลิตภัณฑ์เทนเซอร์ตลกๆ torch.einsum (หรือ numpy.einsum) คือเพื่อนของคุณ:

batch_size = 5
A = torch.rand(13, 13, 13, 13)
a = torch.rand(batch_size, 13)
b = torch.rand(batch_size, 13)
c = torch.rand(batch_size, 13)
d = torch.rand(batch_size, 13)
B = torch.einsum('ijkl,bi,bj,bk,bl->b', A, a, b, c, d)
person Shai    schedule 20.01.2021
comment
เยี่ยมเลย ขอบคุณมาก ไม่รู้ฟังก์ชันนี้เลย มันสามารถทำงานบน gpu ได้ด้วยเหรอ? - person Jogima_cyber; 20.01.2021
comment
@Jogima_cyber torch.einsum เป็นส่วนหนึ่งของการดำเนินการพื้นฐานของ pytorch ไม่เพียงใช้งานได้กับ cpu/gpu เท่านั้น แต่ยังเผยแพร่การไล่ระดับสีไปยังเทนเซอร์อินพุตอีกด้วย - person Shai; 20.01.2021
comment
การคำนวณที่ซ่อนอยู่นั้นยอดเยี่ยมมากและซับซ้อนมาก - person Jogima_cyber; 20.01.2021