繁体   English   中英

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

[英]How to use tf.while_loop for nested FOR loop

我正在研究使用tensorflow实现的模型。 一切都进行得很顺利,直到我必须实现一个嵌套函数(类似)

方程

使用嵌套的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? 例如,在我的情况下,我有:

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据我了解,要在“名称”选项中使用的tf.while_loop字符串或整数。

Re(1)嵌套的tf.while_loop正常工作。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM