每次迭代for循环的Tensorflow变得越来越慢

use*_*533 2 tensorflow

我正在为我的算法做一些评估,我通过计算两个图像之间的3种不同类型的损失来比较一些生成的图像和地面实况图像.代码的逻辑是:

  1. 我遍布所有地面真相图像
  2. 对于每个地面实况图像,我遍历相关的生成图像,并通过计算3个损失来检查每个地面真实图像

如下所示,每次迭代的代码运行时间都在增加.这使得代码无法在合理的时间内完成运行.可能是什么导致了这个?

代码包含在下面.此外,我正在使用爱德华图书馆的Tensorflow,如果这是相关的.我使用以下命令创建会话:

sess = ed.get_session()
Run Code Online (Sandbox Code Playgroud)

开始评估...... 100%|██████████████████████████████████████████ ███| 40/40 [01:36 <00:00,2.53s/it] ----------摘要图片001 ------------开始评价...... 100%| █████████████████████████████████████████████| 40/40 [01:44 <00:00,2.61s/it] ----------摘要图片002 ------------开始评价...... 100%| █████████████████████████████████████████████| 40/40 [01:57 <00:00,3.59s/it] ----------摘要图003 ------------开始评价...... 100%| █████████████████████████████████████████████| 40/40 [02:16 <00:00,3.34s/it] ----------摘要图004 ------------开始评价...... 100%| █████████████████████████████████████████████| 40/40 [02:25 <00:00,3.56s/it] ----------摘要图005 ------------开始评价...... 100%| █████████████████████████████████████████████| 40/40 [02:45 <00:00,4.00s/it] ----------摘要图006 ------------开始评价...... 100%| █████████████████████████████████████████████| 40/40 [02:54 <00:00,4.19s/it] ----------摘要图007 ------------开始评价...... 100%| █████████████████████████████████████████████| 40/40 [03:11 <00:00,4.58s/it] ----------摘要图片008 ------------开始评价...... 100%| ████████████████████████████████████████████| 40/40 [03:26 <00:00,5.02s/it] ----------摘要图片009 ------------开始评价...... 100%| ████████████████████████████████████████████| 40/40 [03:38 <00:00,5.58s/it] ----------摘要图片010 ------------开始评价...... 100%| ████████████████████████████████████████████| 40/40 [03:51 <00:00,5.77s/it]

for i in range(inference_batch_size):
    compare_vae_hmc_loss(model.decode_op, model.encode_op, model.discriminator_l_op,
                               x_ad[i:i+1], samples_to_check[:, i, :], config)

def compare_vae_hmc_loss(P, Q, DiscL, x_gt, samples_to_check, config):
    print ("Starting evaluation...")

    x_samples_to_check = ...

    for i, sample in enumerate(tqdm(x_samples_to_check)):

        for j in range(sample_to_vis):
            plot_save(x_samples_to_check[j], './out/{}_mcmc_sample_{}.png'.format(img_num, j + 1))

        avg_img = np.mean(x_samples_to_check, axis=0)
        plot_save(avg_img, './out/{}_mcmcMean.png'.format(img_num))

        r_loss = recon_loss(x_gt, sample)
        l_loss = l2_loss(x_gt, sample)
        lat_loss = l_latent_loss(l_th_x_gt, l_th_layer_samples[i:i+1])
        total_recon_loss += r_loss
        total_l2_loss += l_loss
        total_latent_loss += lat_loss

        if r_loss < best_recon_loss:
            best_recon_sample = sample
            best_recon_loss = r_loss

        if l_loss < best_l2_loss:
            best_l2_sample = sample
            best_l2_loss = l_loss

        if lat_loss < best_latent_loss:
            best_latent_sample = sample
            best_latent_loss = lat_loss

def l2_loss(x_gt, x_hmc):
    if jernej_Q_P:
        return tf.norm(x_gt - x_hmc).eval()
    else:
        return tf.norm(x_gt-x_hmc).eval()


def recon_loss(x_gt, x_hmc):
    if jernej_Q_P:
        return tf.reduce_sum(tf.nn.sigmoid_cross_entropy_with_logits(logits=x_hmc, labels=x_gt), 1).eval()
    else:
        return tf.reduce_sum(tf.nn.sigmoid_cross_entropy_with_logits(logits=x_hmc[1], labels=x_gt), 1).eval()


def l_latent_loss(l_th_x_gt, l_th_x_hmc):
    return tf.norm(l_th_x_gt - l_th_x_hmc).eval()
Run Code Online (Sandbox Code Playgroud)

dga*_*dga 7

问题在于,您在处理的每个样本中都会向图形中添加新的操作 - 该compare_vae_hmc_loss函数每次执行时都会添加新节点(它调用tf.函数).这意味着您的图表越来越大,占用的内存也越来越多.

您需要做的是定义一次计算图,然后多次调用它.所有这些调用return tf.norm(x_gt-x_hmc).eval()都在图中创建一个永久存在的新节点.相反,您应该保存您创建的节点一次,记住python变量,然后在每次需要时拉动该节点.