【已解决】ValueError: zero-size array to reduction operation minimum which has no identity
那问题不是在这加载的, 那就好玩了,肯定在其他地方,但是究竟在哪呢?回想一下,我们在加载数据的时候使用到相应的yaml文件的,那yaml文件肯定有相应的相应的配置文件.这个错误通常是因为在执行某种汇总操作(例如最小值、最大值、平均值等)时,被操作的数组是一个零大小的数组,而这种操作不支持对零大小的数组进行操作。打印相应的数据,但是发现对应的x是空值,那肯定是没办法找相应的最小值或者最大值啊!ok,
问题描述
承接之前的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
原因分析及解决
这个错误通常是因为在执行某种汇总操作(例如最小值、最大值、平均值等)时,被操作的数组是一个零大小的数组,而这种操作不支持对零大小的数组进行操作。
要解决这个问题,可以采取以下步骤:
检查数据:首先,确保输入数据数组不是空数组。可以使用条件语句来检查数组是否为空,然后再进行汇总操作。
处理特殊情况:如果代码逻辑需要处理零大小的数组,可以添加条件语句以处理这种情况。例如,你可以在执行最小值操作之前检查数组的大小,如果数组为空,则跳过最小值操作。
初步分析
找到出错的位置:
打印相应的数据,但是发现对应的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,这样一来就不会有其他问题了
完结撒花
看结果:
能跑了,美滋滋.
更多推荐
所有评论(0)