我正在对我的算法进行一些评估,我通过计算两幅图像之间的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()
答案 0 :(得分:7)
问题在于,您每处理一个样本时都会向图表添加新操作 - compare_vae_hmc_loss
函数每次执行时都会添加新节点(它调用函数)。这意味着您的图表越来越大,占用的内存也越来越多。
您需要做的是定义计算图一次,然后多次调用它。像return tf.norm(x_gt-x_hmc).eval()
这样的所有调用都是在图表中创建一个永久存在的新节点。相反,您应该保存您创建的节点一次,记住python变量,然后在每次需要时拉上该节点。