You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 03:45:04