2017-11-19 1 views
1

두 이미지 사이에서 3 가지 유형의 손실을 계산하여 일부 생성 된 이미지를 지상 진실 이미지와 비교하는 알고리즘에 대한 몇 가지 평가를하고 있습니다. 코드의 논리는 3 손실 를 계산함으로써 모든 지표 사실 이미지 각 지표 사실 이미지를위한 for 루프를 반복 할 때마다 Tensorflow가 느려지고 느려짐

  • , 해당 생성 된 화상 위에 I 루프와 그라운드 진실 이미지에 대하여 각각 확인을 통해

    1. I 루프

    아래에서 볼 수 있듯이 각 반복마다 코드의 실행 시간이 증가하고 있습니다. 이렇게하면 합리적인 시간 내에 코드를 실행할 수 없게됩니다. 무엇이 이것을 일으킬 수 있습니까?

    코드는 다음과 같습니다. 또한 관련성이있는 경우 Tensorflow에 대한 Edward 라이브러리를 사용하고 있습니다. 나는 다음과 같은 명령을 사용하여 내 세션을 생성 :

    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 [3시 51분 < 0시, 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() 
    
  • +0

    여기에 누락 된 코드가 있으므로 어떤 말을해야할지 모르겠지만 대개 각 반복을 느리게 할 때 그래프를 정의하는 대신 우연히 그래프에/다시 작성하기 때문에 여러 번 실행합니다. 예를 들어, 여기서 compare_vae ...는 그래프에 tf 작업을 추가하는 배치 크기 당 한 번 호출합니다. 문제를 해결하는 데 충분한 힌트 일 수도 있지만, 그렇지 않은 경우 세션을 만드는 코드를 포함 할 수 있으며 더 중요한 것은 eval을 호출하거나 실행하는 코드입니까? – dga

    +0

    흠 3 가지 손실을 계산할 때 run/eval만을 호출한다고 생각합니다. 그래서 다른 것을 포함 시킬지 확신하지 못합니다. 어쨌든, 여기 내 코드에서 제거 된 최소한의 라인을 가진 요점이 있습니다 https://gist.github.com/shenkev/f8f4d2f2f05d6fc81e20b2e49a35c2ba – user3768533

    답변

    4

    문제는 당신이 그래프는 처리하는 모든 샘플에 새로운 작전을 추가하는 것입니다 -합니다 (compare_vae_hmc_loss 기능은 새로운 노드를 추가합니다 실행될 때마다 함수를 호출합니다. 이것은 그래프가 커지고 점점 더 많은 메모리를 차지한다는 것을 의미합니다.

    계산 그래프 을 한 번으로 정의한 다음 여러 번 호출해야합니다. return tf.norm(x_gt-x_hmc).eval()과 같은 전화는 모두 이며 그래프에 영원히 지속될 노드를 새로 만듭니다. 대신, 한 번 생성 한 노드를 저장하고 파이썬 변수를 기억한 다음 필요할 때마다 해당 노드를 가져와야합니다.

    +0

    문제를 확인해 주셔서 감사합니다. 모든 for-loops를 텐서 계산으로 대체하여 문제를 해결할 수있었습니다 (Tensorflow가 사용되는 방식이라고 생각합니다!). 따라서 계산 그래프가 성장하고 성장하지 않습니다. – user3768533

    관련 문제