这篇文章的复现:Rethinking Federated Learning with Domain Shift: A Prototype View
错误指令如下
导儿说这周复现不了就完蛋了 😭😭
这篇文章的复现:Rethinking Federated Learning with Domain Shift: A Prototype View
错误指令如下
导儿说这周复现不了就完蛋了 😭😭
引自免费微信小程序:皆我百晓生
看起来你在尝试复现《Rethinking Federated Learning with Domain Shift: A Prototype View》这篇论文中的代码,并遇到了一个与NumPy广播(broadcasting)相关的错误。在Python中,广播是指NumPy自动处理不同形状数组的操作,使其能够在运算时兼容。然而,当两个数组的维度不匹配且无法通过添加前导零来使之匹配时,就会出现"operands could not be broadcast together with shapes (20,) "这样的错误。
根据你提供的信息,这个错误出现在get_data_loaders
函数中的一行代码上:
using_list = self.DOMAINS_LIST if selected_domain_list == [] else selected_domain_list
错误提示 (20,)
指的是某个数组的形状只有一个元素,可能是self.DOMAINS_LIST
或selected_domain_list
其中之一。为了解决这个问题,我们需要确保这两个列表在进行条件判断之前具有相同的长度,或者至少可以通过广播得到相同长度。
这里有一个可能的解决方案,检查selected_domain_list
是否为空,如果不为空,则确保它的长度与self.DOMAINS_LIST
相同。可以这样做:
from typing import List
# 假设DOMAINS_LIST是一个包含多个子列表的列表,每个子列表代表一个域的数据
def get_data_loaders(self, selected_domain_list: List[str]) -> None:
using_list = self.DOMAINS_LIST.copy()
# 如果selected_domain_list不为空且其长度与DOMAINS_LIST不同,抛出异常
if selected_domain_list and len(selected_domain_list) != len(using_list):
raise ValueError("selected_domain_list length should match DOMAINS_LIST")
nor_transform = self.Nor_TRANSFORM
sin_chan_nor_transform = self.Singel_Channel_Nor_TRANSFORM
train_dataset_list = []
test_dataset_list = []
dataloader_size = []
Label_transform = transforms.TypeCast(mindspore.int32)
test_label_transform = transforms.TypeCast(mindspore.int32)
# ... 其他代码
这段代码首先复制了self.DOMAINS_LIST
,然后检查selected_domain_list
是否已提供并且长度正确。如果提供了但长度不正确,它会抛出一个异常。这样可以确保在执行任何可能引发广播错误的操作之前,两个列表具有相同的长度。
如果你的self.DOMAINS_LIST
不是多级结构,而是一个简单的列表,那么只需要比较它们的长度即可。另外,确保你的输入数据是正确的,即selected_domain_list
应该是一个包含20个元素的列表,或者为空。如果这不是问题所在,那么可能需要进一步分析其他相关代码部分以找到导致错误的确切原因。
请将上述代码片段替换到你的get_data_loaders
函数中,然后运行看看是否有改进。如果有任何进一步的问题或困惑,请随时告诉我。