如何使用tensorflow处理嵌套循环?

2024-05-04 19:57:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我不熟悉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)

Tags: 函数infortftensorflow语法rangelist
1条回答
网友
1楼 · 发布于 2024-05-04 19:57:57

假设这些:

  • lorentz.shape == (batch, grid, dim, dim)并且在循环之前为零。在
  • osc_stre.shape == (batch, dim, dim, modes)
  • energies.shape == (grid,)
  • e_j.shape == (batch, modes)

然后:

osc_stre = K.reshape(osc_stre, (-1, 1, dim, dim, modes))
energies = K.reshape(energies, (1, grid, 1, 1, 1))   
e_j = K.reshape(e_j, (-1, 1, 1, 1, modes))

lorentz = 1J*osc_stre/(energies-e_j) 

identity = np.zeros((1, 1, dim, dim, modes))
for d in range(min(modes,dim)):
    identity[0,0,d,d,d] = 1
identity = K.variable(identity, dtype = tf.complex64)

lorentz += identity
lorentz = K.sum(lorentz, axis=-1)

相关问题 更多 >