Tujuan Tujuan saya adalah menghitung tensor yang diberikan oleh rumus yang dapat Anda lihat di bawah. Indeks i, j, k, l berkisar dari 0 hingga 40 dan p, m, x dari 0 hingga 80.
Pendekatan Tensordot Penjumlahan ini hanya mengontrak 6 indeks tensor yang sangat besar. Saya mencoba melakukannya dengan titik tensor yang memungkinkan penghitungan seperti itu tetapi masalah saya adalah memori meskipun saya melakukan satu titik tensor diikuti oleh titik lainnya. (Saya bekerja di colab jadi saya memiliki RAM 12GB)
Pendekatan loop bersarang Namun ada beberapa kesimetrian tambahan yang mengatur matriks B, yaitu satu-satunya elemen bukan nol dari B{ijpx} yang sedemikian rupa sehingga i+j= p+x. Oleh karena itu saya dapat menulis p dan m sebagai fungsi dari x (p=i+j-x, m=k+l-x)dan kemudian saya melakukan 5 loop yaitu untuk i,j,k,l,x tetapi kemudian di sisi lain masalahnya adalah waktunya karena perhitungannya memakan waktu 136 detik dan saya ingin mengulanginya berkali-kali.
Tujuan pengaturan waktu dalam pendekatan loop bersarang Pengurangan waktu sebanyak sepuluh kali lipat sudah cukup memuaskan, namun jika memungkinkan untuk menguranginya sebanyak 100 kali lipat, hal ini sudah lebih dari cukup.
Apakah Anda punya ide untuk mengatasi masalah memori atau mengurangi waktunya? Bagaimana Anda menangani penjumlahan tersebut dengan batasan tambahan?
(Keterangan: Matriks A simetris dan saya belum pernah menggunakan fakta ini sejauh ini. Tidak ada lagi kesimetrian.)
Berikut ini kode untuk loop bersarang:
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
Dan kode untuk pendekatan tensor dot:
P=np.tensordot(A,B,axes=((0),(2)))
T=np.tensordot(P,B,axes=((0,3),(2,3)))
tensordot
dan dengan loop bersarang, sehingga kami mendapatkan gambaran yang lebih baik tentang masalahnya? - person jdehesa   schedule 29.01.2019tf.einsum
? Seperti:t = tf.einsum('pm,ijpx,klmx->ijkl', a, b, b)
. Tidak yakin itu akan membuat perbedaan dengan tensordot tetapi boleh mencobanya. - person jdehesa   schedule 29.01.2019t = np.einsum('pm,ijpx,klmx->ijkl', a, b, b)
. - person jdehesa   schedule 29.01.2019