如何使用tf.while_loop嵌套FOR循环

时间:2018-03-12 20:39:54

标签: python tensorflow neural-network deep-learning

我正在研究一个使用tensorflow实现的模型。一切顺利,直到我必须实现嵌套功能(类似于)。

equation

使用嵌套的FOR循环。例如下面的内容:

for k in range(n):
    Gk = tf.convert_to_tensor(G[k], dtype=self.dtype)
    Gk = tf.tile(tf.expand_dims(Gk,0),[tf.shape(trueX)[0],1])

    for j in range(m):
        pre_Y  = self.build_nn( Gk, 200, '{}phi2'.format(j), tf.AUTO_REUSE )
        log_pred_Y = tf.layers.dense( pre_Y, 2, name='{}phi2y'.format(j), reuse=tf.AUTO_REUSE )   
        pred_Y = tf.exp( log_pred_Y )
        ...........
        pre_cost += tf.multiply( ll, pred_Y )
    _cost += tf.reduce_sum(tf.multiply( pre_cost, pre_G), -1)

显然是一个非常糟糕的主意,因为它不仅需要时间,而且会占用大量内存。几天来我一直试图使用tf.while_loop重新实现,因为我理解应该比使用本机python循环更好。我一直在尝试实现一个嵌套的tf.while_loop,但都无济于事。我有两个问题:

  1. 使用嵌套的tf.while_loop是个好主意吗? (即有一个 tf.while_loop在另一个内部来捕获计算结果 嵌套FOR循环)。如果没有,是否可以使用tf.while_loop捕获嵌套FOR循环的计算?
  2. 当您需要使用不同的密集层时,如何使用tf.while_loop 在每个循环?例如在我的情况下,我有:
  3. pre_Y  = self.build_nn( Gk, 200, '{}phi2'.format(j), tf.AUTO_REUSE ) 
    log_pred_Y = tf.layers.dense( pre_Y, 2, name='{}phi2y'.format(j), reuse=tf.AUTO_REUSE )
    

    使用名称中的索引来标识每个循环中使用的层。使用python FOR循环,我使用索引为要重用的层指定名称但是使用tf.while_loop,我找不到任何方法为密集层分配唯一的名称,因为我无法传递python正如我所理解的那样,在“name”选项中使用tf.while_loop的字符串或整数。

1 个答案:

答案 0 :(得分:0)

Re(1)个嵌套的tf.while_loop很好用。

关于(2),tf.while_loop无法完成这种事情,您需要使用python展开循环。