Я новичок в tenorflow. Я работаю с керасом, но для создания настраиваемой функции потерь я более или менее вынужден написать функцию в тензорном потоке.
Я застрял в точке, где я должен перевести этот следующий numpy для цикла в синтаксис тензорного потока.
for j in range(grid):
for k in range(modes):
for l in range(dim):
for m in range(dim):
lorentz[:,j,l,m] += 1J*osc_stre[:,l,m,k]/(energies[j]-e_j[:,k])
if l == m == k:
lorentz[:,j,l,m] += 1
Здесь вы можете увидеть начальные формы массивов:
e_j = zeros([sample_nr,modes],dtype='complex')
osc_stre = zeros([sample_nr,dim,dim,modes],dtype='complex')
lorentz = zeros([sample_nr,grid,dim,dim],dtype='compex')
энергии [j] имеет форму (сетку)
возможно ли решить эту проблему с помощью тензорного потока? Кто-нибудь может дать мне подсказку, как перевести это в синтаксис тензорного потока? Я уже пробовал пару вещей, таких как тензор потока в цикле, но одна из больших проблем заключается в том, что объекты тензор потока не поддерживают назначение элементов.
РЕДАКТИРОВАТЬ:
я думаю, что нашел решение для этой упрощенной версии проблемы:
for j in range(grid):
for k in range(modes):
lorentz[j] += 1J*osc_stre[k]/(energies[j]-e_j[k])
if k == 0:
lorentz[j] += 1
решение:
lorentz_list = []
tf_one = tf.ones([1], complex64)
tf_i = tf.cast(tf.complex(0.,1.), complex64)
energies_float = tf.cast(energies,float32)
energies_complex = tf.complex(energies_float,tf.zeros([energy_grid],float32))
for j in range(energy_grid):
lorentz_list.append(tf.add(tf_one,tf.reduce_sum(tf.multiply(tf_i,tf.divide(osc_stre_tot,tf.subtract(energies_complex[j],e_j))),-1)))
lorentz = tf.stack(lorentz_list)