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

时间:2017-11-19 01:17:57

标签: tensorflow

我正在对我的算法进行一些评估,我通过计算两幅图像之间的3种不同类型的损失,将一些生成的图像与地面实况图像进行比较。代码的逻辑是:

  1. 我遍布所有地面真相图像
  2. 对于每个地面实况图像,我循环遍历相关的生成图像并通过计算3损失检查每个地面实况图像
  3. 每次迭代时代码的运行时间都在增加,如下所示。这使得代码无法在合理的时间内完成运行。可能导致这种情况的原因是什么?

    代码包括在下面。我也使用爱德华图书馆作为Tensorflow,如果这是相关的。我使用以下命令创建会话:

    sess = ed.get_session()
    

    开始评估...... 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()
    

1 个答案:

答案 0 :(得分:7)

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

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