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

Tensorflow for循环的每次迭代都会变得越来越慢,tensorflow,Tensorflow,我正在对我的算法进行评估,通过计算两幅图像之间3种不同类型的损失,将生成的图像与地面真实图像进行比较。代码的逻辑是: 我在所有地面真相图像上循环 对于每个地面真实图像,我循环相关生成的图像,并通过计算3个损失来对照地面真实图像检查每个图像 代码的运行时间随着每次迭代而增加,如下所示。这使得代码无法在合理的时间内完成运行。这可能是什么原因造成的 代码包括在下面。如果相关的话,我也在使用Tensorflow的Edward库。我使用以下命令创建会话: sess = ed.get_session()

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

  • 我在所有地面真相图像上循环
  • 对于每个地面真实图像,我循环相关生成的图像,并通过计算3个损失来对照地面真实图像检查每个图像
  • 代码的运行时间随着每次迭代而增加,如下所示。这使得代码无法在合理的时间内完成运行。这可能是什么原因造成的

    代码包括在下面。如果相关的话,我也在使用Tensorflow的Edward库。我使用以下命令创建会话:

    sess = ed.get_session()
    
    正在开始评估。。。
    100%|█████████████████████████████████████████████| 40/40[01:36问题在于,每次处理样本时,都会向图形中添加新的操作--
    compare\u vae\u hmc\u loss
    函数每次执行时都会添加新的节点(它调用tf.functions)。这意味着图形越来越大,占用的内存越来越多


    您需要做的是定义一次计算图,然后多次调用它正在图中创建一个新节点,该节点将永久保留。相反,您应该保存创建的节点一次,记住python变量,然后在每次需要时使用该节点。

    这里缺少代码,因此我不太确定该说什么,但通常当您减慢每次迭代时,这是因为您遇到了意外tally添加/重新创建图形,而不是定义一次图形,然后多次执行。例如,这里您将调用compare_vae…一次/batch size,这是向图形添加tf ops。这可能是解决问题的足够提示,但如果不是,您能否包含创建会话和更重要任务的代码首先,调用eval或run的代码?嗯,我想我只是在计算3种不同的损失时才调用run/eval,所以我不确定还要包括什么。总之,这里有一个要点,从我的代码中删除了最少的行。谢谢你发现了这个问题。我能够通过用张量计算替换所有for循环来修复它(我猜Tensorflow的使用方式!)因此计算图并没有不断增长。
    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()