Цель Моя цель — рассчитать тензор по формуле, которую вы можете увидеть ниже. Индексы i, j, k, l проходят от 0 до 40, а p, m, x от 0 до 80.
Подход Tensordot Это суммирование просто сокращает 6 индексов огромного тензора. Я попытался сделать это с помощью тензорной точки, которая позволяет выполнять такие вычисления, но тогда моя проблема заключается в памяти, даже если я делаю одну тензорную точку, а затем другую. (Я работаю в colab, поэтому у меня есть 12 ГБ ОЗУ)
Подход с вложенными циклами Но есть некоторые дополнительные симметрии, управляющие матрицей 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
? Как 2_. Не уверен, что это должно иметь какое-либо значение с тензордом, но может попробовать. - person jdehesa   schedule 29.01.2019t = np.einsum('pm,ijpx,klmx->ijkl', a, b, b)
. - person jdehesa   schedule 29.01.2019