【问题标题】:TensorFlow optimization of nested while_loops嵌套 while_loops 的 TensorFlow 优化
【发布时间】:2017-10-30 16:10:41
【问题描述】:

我正在尝试实现此方法以与 TensorFlow 一起使用(取自 here):

def _jacobian_product_sq_euc(X, Y, E, G):
    m = X.shape[0]
    n = Y.shape[0]
    d = X.shape[1]

    for i in range(m):  # 0 - 4
        for j in range(n):
            for k in range(d):
                G[i, k] += E[i,j] * 2 * (X[i, k] - Y[j, k])

我已经使用三个 tf.while_loops 重写了它,但注意到它非常慢(工作示例 here):

def calc_score():
    gm = tf.zeros([16, 256])

    i = 0
    i_max = 16
    j_max = 16
    d_max = 256

    while_condition_loop1 = lambda i, gm_score: tf.less(i, i_max)
    while_condition_loop2 = lambda i, j, gm_score: tf.less(j, j_max)
    while_condition_loop3 = lambda i, j, d, gm_score: tf.less(d, d_max)
    gm_score = tf.constant(0.)

    def loop3(i, j, d, gm_score):
        gm_score = gm_score + e[i+1, j+1] * 2 * tf.abs((x[i,d] - y[j, d]))
        return [i, j, tf.add(d,1), gm_score]

    def loop2(i, j, gm_score):
        d = 0
        _, _, _, gm_score = tf.while_loop(while_condition_loop3, loop3, [i, j, d, gm_score])
        return [i, tf.add(j,1), gm_score]

    def loop1(i, gm_score):
        j = 0
        _, _, gm_score = tf.while_loop(while_condition_loop2, loop2, [i, j, gm_score])
        return [tf.add(i,1), gm_score]

    _, gm_score = tf.while_loop(while_condition_loop1, loop1, [i, gm_score])

    return gm_score

(注意:我知道在这种情况下我返回的是单个值,而不是矩阵。但这是一个单独的问题)

计算一系列 16x256 值大约需要 4-5 秒。现在我想知道如何优化它。在这种情况下,是否有使用 tf.while_loop 的替代方法?我的 CPU 似乎也有相当高的负载,我在训练时收到很多这样的消息:

2017-10-30 17:00:51.234993: I tensorflow/core/common_runtime/gpu/pool_allocator.cc:247] PoolAllocator:在 257610 次获取请求后,put_count=385620 evicted_count=128000 eviction_rate=0.331933 且不满意分配率=0

我对 TensorFlow 的了解仍然有限,我想知道可以做些什么来优化这种方法。

我正在使用 python 2.7 和 TensorFlow 1.2.0

【问题讨论】:

    标签: python tensorflow


    【解决方案1】:

    我不熟悉雅可比方程,但基本上你应该避免在 Tensorflow 中循环遍历元素。您应该在张量/矩阵运算中考虑它并使用 tf API 进行张量运算。我在他们的源代码中找到了雅可比计算:

    https://fossies.org/linux/tensorflow/tensorflow/python/ops/gradient_checker.py

    也许有帮助。

    【讨论】:

      猜你喜欢
      • 2016-04-20
      • 2021-12-03
      • 2017-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-10
      相关资源
      最近更新 更多