问题描述

        承接之前的bug问题,具体是这样的:

Traceback (most recent call last):
  File "embed.py", line 159, in <module>
    main()
  File "embed.py", line 138, in main
    (x_wm, y_wm), defense = defense_config.embed(defense=defense,
  File "/home/visionx/anaconda3/envs/watermark/lib/python3.8/site-packages/mlconfig/config.py", line 20, in __call__
    return self.instantiate(*args, **kwargs)
  File "/home/visionx/anaconda3/envs/watermark/lib/python3.8/site-packages/mlconfig/config.py", line 65, in instantiate
    return func_or_cls(*args, **kwargs)
  File "/home/visionx/project/Watermark-Robustness-Toolbox/wrt/defenses/watermark/adi.py", line 188, in wm_adi_embed
    return defense.embed(**kwargs), defense
  File "/home/visionx/project/Watermark-Robustness-Toolbox/wrt/defenses/watermark/adi.py", line 111, in embed
    train_and_wm_loader = train_loader.add_numpy_data(x_wm, y_wm, boost_factor=boost_factor)
  File "/home/visionx/project/Watermark-Robustness-Toolbox/wrt/training/datasets/wrt_data_loader.py", line 125, in add_numpy_data
    if np.min(x) < 0 or np.max(x) > 1:
  File "<__array_function__ internals>", line 200, in amin
  File "/home/visionx/anaconda3/envs/watermark/lib/python3.8/site-packages/numpy/core/fromnumeric.py", line 2946, in amin
    return _wrapreduction(a, np.minimum, 'min', axis, None, out,
  File "/home/visionx/anaconda3/envs/watermark/lib/python3.8/site-packages/numpy/core/fromnumeric.py", line 86, in _wrapreduction
    return ufunc.reduce(obj, axis, dtype, out, **passkwargs)
ValueError: zero-size array to reduction operation minimum which has no identity

原因分析及解决

        这个错误通常是因为在执行某种汇总操作(例如最小值、最大值、平均值等)时,被操作的数组是一个零大小的数组,而这种操作不支持对零大小的数组进行操作。

要解决这个问题,可以采取以下步骤:

  1. 检查数据:首先,确保输入数据数组不是空数组。可以使用条件语句来检查数组是否为空,然后再进行汇总操作。

  2. 处理特殊情况:如果代码逻辑需要处理零大小的数组,可以添加条件语句以处理这种情况。例如,你可以在执行最小值操作之前检查数组的大小,如果数组为空,则跳过最小值操作。

        初步分析

        找到出错的位置:

        打印相应的数据,但是发现对应的x是空值,那肯定是没办法找相应的最小值或者最大值啊!再看看这个x是从哪来的呢?

        再继续找

        ok,这个时候就明白了,是在加载数据的时候加载到了空值,那加载数据在哪呢?

        继续分析

        这个时候会发现,在上面给的

url = "https://www.dropbox.com/s/z11ds7jvewkgv18/adi.zip?dl=1"

        但我们点击这个的时候发现已经被作者删除了分享,那就浅浅私聊一下作者要一下:

        这个时候我们下载下来并且需要改为本地地址,改完之后我们发现:

没有一点用!!!

        那问题不是在这加载的, 那就好玩了,肯定在其他地方,但是究竟在哪呢?回想一下,我们在加载数据的时候使用到相应的yaml文件的,那yaml文件肯定有相应的相应的配置文件.

        深度分析

       

        看到了吧,我们只需要把上面的adi.zip解压然后放到~/.wrt/data目录下就可以了

        这个时候我们再去操作会发现报其他的错误:

        新错误:IsADirectoryError: [Errno 21] Is a directory: '/home/visionx/.wrt/data/adi/pics'

        这就有点奇怪了,为什么报这个错呢?来看一下详细的报错信息:

Traceback (most recent call last):
  File "embed.py", line 159, in <module>
    main()
  File "embed.py", line 138, in main
    (x_wm, y_wm), defense = defense_config.embed(defense=defense,
  File "/home/visionx/anaconda3/envs/watermark/lib/python3.8/site-packages/mlconfig/config.py", line 20, in __call__
    return self.instantiate(*args, **kwargs)
  File "/home/visionx/anaconda3/envs/watermark/lib/python3.8/site-packages/mlconfig/config.py", line 65, in instantiate
    return func_or_cls(*args, **kwargs)
  File "/home/visionx/project/Watermark-Robustness-Toolbox/wrt/defenses/watermark/adi.py", line 188, in wm_adi_embed
    return defense.embed(**kwargs), defense
  File "/home/visionx/project/Watermark-Robustness-Toolbox/wrt/defenses/watermark/adi.py", line 110, in embed
    x_wm, y_wm = self.keygen(wm_loader, num_classes=self.num_classes, keylength=keylength)
  File "/home/visionx/project/Watermark-Robustness-Toolbox/wrt/defenses/watermark/adi.py", line 67, in keygen
    x_wm = collect_n_samples(n=keylength, data_loader=wm_loader, has_labels=False)
  File "/home/visionx/project/Watermark-Robustness-Toolbox/wrt/training/datasets/utils.py", line 53, in collect_n_samples
    for x in data_loader:
  File "/home/visionx/anaconda3/envs/watermark/lib/python3.8/site-packages/torch/utils/data/dataloader.py", line 630, in __next__
    data = self._next_data()
  File "/home/visionx/anaconda3/envs/watermark/lib/python3.8/site-packages/torch/utils/data/dataloader.py", line 1345, in _next_data
    return self._process_data(data)
  File "/home/visionx/anaconda3/envs/watermark/lib/python3.8/site-packages/torch/utils/data/dataloader.py", line 1371, in _process_data
    data.reraise()
  File "/home/visionx/anaconda3/envs/watermark/lib/python3.8/site-packages/torch/_utils.py", line 694, in reraise
    raise exception
IsADirectoryError: Caught IsADirectoryError in DataLoader worker process 0.
Original Traceback (most recent call last):
  File "/home/visionx/anaconda3/envs/watermark/lib/python3.8/site-packages/torch/utils/data/_utils/worker.py", line 308, in _worker_loop
    data = fetcher.fetch(index)
  File "/home/visionx/anaconda3/envs/watermark/lib/python3.8/site-packages/torch/utils/data/_utils/fetch.py", line 51, in fetch
    data = [self.dataset[idx] for idx in possibly_batched_index]
  File "/home/visionx/anaconda3/envs/watermark/lib/python3.8/site-packages/torch/utils/data/_utils/fetch.py", line 51, in <listcomp>
    data = [self.dataset[idx] for idx in possibly_batched_index]
  File "/home/visionx/project/Watermark-Robustness-Toolbox/wrt/training/datasets/trigger_datasets.py", line 26, in __getitem__
    image = Image.open(os.path.join(self.root, img_name)).convert('RGB')

  File "/home/visionx/anaconda3/envs/watermark/lib/python3.8/site-packages/PIL/Image.py", line 3218, in open
    fp = builtins.open(filename, "rb")
IsADirectoryError: [Errno 21] Is a directory: '/home/visionx/.wrt/data/adi/pics'

        重点是上面那句(高亮加黑标出),找到对应的代码

         我们会发现,这是直接在root目录下扫描图片,所以文件夹有文件夹肯定是错误的,大胆一点,做一下改变,把adi文件目录下全部变为图片,也就是把其他目录解压出来放到上一级目录就可以了,看结果:

        ok,这样一来就不会有其他问题了

完结撒花

        看结果:

        能跑了,美滋滋.

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐