为何PyTorch的torch.utils.save_image会覆盖文件夹内已保存的图片?
问题根因
图片覆盖的核心原因是count变量的作用域错误:count = 1 定义在attack()函数内部,每次调用attack()函数时,count都会被重置为1,导致所有图片的保存路径永远是result_img/adversarial1.png和result_img/original1.png,新保存的图片会直接覆盖旧文件。
修复方案
前置操作
先在代码入口新增文件夹创建逻辑,避免因文件夹不存在导致保存失败:
import os os.makedirs("result_img", exist_ok=True)
可选修复方式(二选一即可)
方式1:用批次序号+目标类别拼接文件名(推荐,无重复风险)
修改attack()函数的入参和保存逻辑,传入批次、目标类别作为唯一标识:
# 修改attack函数定义,新增batch_idx参数 def attack(img, label, net, batch_idx, target=None, pixels=1, maxiter=75, popsize=400, verbose=False): # 其余原有代码保持不变,删除原有的count定义、count自增逻辑 # ========== 修改保存路径部分 ========== target_str = str(target) if target is not None else "none" vutils.save_image(vutils.make_grid(attack_image, normalize=True, scale_each=True), f'result_img/adversarial_batch{batch_idx}_target{target_str}.png') vutils.save_image(vutils.make_grid(img, normalize=True, scale_each=True), f'result_img/original_batch{batch_idx}.png') # ========== 其余原有代码保持不变 ==========
再修改attack_all()中调用attack的逻辑,传入当前批次序号:
flag, x = attack(input, target[0], net, batch_idx, target_calss, pixels=pixels, maxiter=maxiter, popsize=popsize, verbose=verbose)
方式2:全局计数变量
如果不需要区分批次、目标类别,直接用全局计数即可:
# 在代码顶部定义全局计数变量 global_count = 1 def attack(img, label, net, target=None, pixels=1, maxiter=75, popsize=400, verbose=False): global global_count # 其余原有代码保持不变,删除原有的count定义 # ========== 修改保存路径部分 ========== vutils.save_image(vutils.make_grid(attack_image, normalize=True, scale_each=True), f'result_img/adversarial{global_count}.png') vutils.save_image(vutils.make_grid(img, normalize=True, scale_each=True), f'result_img/original{global_count}.png') global_count += 1 # ========== 其余原有代码保持不变 ==========
内容的提问来源于stack exchange,提问作者binbbaz
相关产品推荐
相关产品推荐

