เป้าหมาย เป้าหมายของฉันคือการคำนวณเทนเซอร์ที่กำหนดโดยสูตรที่คุณเห็นด้านล่าง ดัชนี i, j, k, l เริ่มจาก 0 ถึง 40 และ p, m, x จาก 0 ถึง 80
แนวทางเทนเซอร์ดอต ผลรวมนี้เป็นเพียงการหดตัวของดัชนีเทนเซอร์จำนวนมหาศาล 6 ดัชนี ฉันพยายามใช้เทนเซอร์ดอทซึ่งช่วยให้สามารถคำนวณได้ แต่ปัญหาของฉันก็คือหน่วยความจำ แม้ว่าฉันจะใช้เทนเซอร์จุดหนึ่งแล้วตามด้วยอีกจุดก็ตาม (ฉันทำงานใน colab ดังนั้นฉันจึงมี RAM 12GB)
การวนซ้ำแบบซ้อนเข้าใกล้ แต่มีสมมาตรเพิ่มเติมบางอย่างที่ควบคุมเมทริกซ์ B กล่าวคือ องค์ประกอบเดียวที่ไม่ใช่ศูนย์ของ B{ijpx} เท่านั้นที่ i+j= p+x ดังนั้นฉันจึงสามารถเขียน p และ m เป็นฟังก์ชันของ x (p=i+j-x, m=k+l-x) จากนั้นฉันก็ทำ 5 ลูปสำหรับ i,j,k,l,x แต่ในทางกลับกัน เวลาเป็นปัญหาเนื่องจากการคำนวณใช้เวลา 136 วินาที และฉันต้องการทำซ้ำหลายครั้ง
เป้าหมายการกำหนดเวลาในแนวทางลูปแบบซ้อน การลดเวลาลงสิบเท่าก็น่าจะน่าพอใจ แต่หากเป็นไปได้ที่จะลดเวลาลงสัก 100 เท่าก็เกินพอ
คุณมีความคิดใด ๆ ที่จะแก้ไขปัญหาหน่วยความจำหรือลดเวลาหรือไม่? คุณจะจัดการกับผลรวมดังกล่าวโดยมีข้อจำกัดเพิ่มเติมได้อย่างไร
(หมายเหตุ: เมทริกซ์ A มีความสมมาตร และฉันยังไม่ได้ใช้ข้อเท็จจริงนี้เลย ไม่มีความสมมาตรอีกต่อไป)
นี่คือโค้ดสำหรับการวนซ้ำแบบซ้อน:
for i in range (0,40):
for j in range (0,40):
for k in range (0,40):
for l in range (0,40):
Sum=0
for x in range (0,80):
p=i+j-x
m=k+l-x
if p>=0 and p<80 and m>=0 and m<80:
Sum += A[p,m]*B[i,j,p,x]*B[k,l,m,x]
T[i,j,k,l]= Sum
และโค้ดสำหรับแนวทางเทนเซอร์ดอท:
P=np.tensordot(A,B,axes=((0),(2)))
T=np.tensordot(P,B,axes=((0,3),(2,3)))
tensordot
และลูปที่ซ้อนกัน เพื่อให้เราเข้าใจปัญหาได้ดีขึ้นหรือไม่ - person jdehesa   schedule 29.01.2019tf.einsum
แล้วหรือยัง ชอบ:t = tf.einsum('pm,ijpx,klmx->ijkl', a, b, b)
. ไม่แน่ใจว่าจะสร้างความแตกต่างกับเทนเซอร์ดอต แต่อาจลองดู - person jdehesa   schedule 29.01.2019t = np.einsum('pm,ijpx,klmx->ijkl', a, b, b)
- person jdehesa   schedule 29.01.2019