我不熟悉tensorflow。我正在使用keras,但是为了创建一个定制的损失函数,我或多或少被迫用tensorflow编写一个函数。 我在必须将下面的numpy for loop转换为tensorflow语法时遇到了困难。在
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
在这里可以看到阵列的初始形状:
^{pr2}$能量[j]有形状(网格)
有没有可能用tensorflow来处理这个问题?有谁能给我一个提示,如何把它翻译成tensorflow语法?我已经尝试过一些东西,比如tensorflow while循环,但是一个大问题是,tensorflow对象不支持项赋值。在
编辑:
我想我已经为这个问题的简化版本想出了一个解决方案:
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)
假设这些:
lorentz.shape == (batch, grid, dim, dim)
并且在循环之前为零。在osc_stre.shape == (batch, dim, dim, modes)
energies.shape == (grid,)
e_j.shape == (batch, modes)
然后:
相关问题 更多 >
编程相关推荐