记录实验过程中遇到的各种问题
持续更新~
1、出现了IndexError
IndexError: index 1 is out of bounds for dimension 0 with size 1
出现 IndexError: index 1 is out of bounds for dimension 0 with size 1 是因为在某个地方访问了一个长度为1的数组的第二个元素,导致越界。需要看错误提示所在的行数和代码逻辑才能确定修改方法。
解决方法:根据提示找到对应的行,判断是哪个元素的数据长度超出了1,将长度超过1的元素进行重新定义,保持数据长度为1。
def calculate_centroid(label, class_num):
centroid = torch.zeros(1)
count = torch.zeros(class_num)
for i in range(class_num):
mask = (label == i)
count[i] = torch.sum(mask)
if count[i] > 0:
centroid[i] = torch.sum(mask.float() * label) / count[i]
return centroid
centroid的长度为1,不存在centroid[i] ,修改为centroid
def calculate_centroid(label, class_num):
centroid = torch.zeros(1)
count = torch.zeros(class_num)
for i in range(class_num):
mask = (label == i)
count[i] = torch.sum(mask)
if count[i] > 0:
centroid= torch.sum(mask.float() * label) / count[i]
return centroid
2、出现了RuntimeError
RuntimeError: Expected all tensors to be on the same device, but found at least two devices, cuda:0 and cpu!
出现RuntimeError:Expected all tensors to be on the same device, but found at least two devices, cuda:0 and cpu!是因为代码中涉及到了CPU和GPU两种设备,导致数据在不同的设备上。需要将它们都放在同一个设备上。
解决方法:找到没有使用GPU的数据,在数据后面加上.cuda()
class Weight_2:
@staticmethod
def calculate_centroid(label, class_num):
centroid = torch.zeros(1)
count = torch.zeros(class_num)
for i in range(class_num):
mask = (label == i)
count[i] = torch.sum(mask)
if count[i] > 0:
centroid += torch.sum(mask.float() * label) / count[i]
return centroid
此时计算centroid和count使用的是cpu,而代码中其余数据使用的是gpu,需要修改centroid和count的代码
def calculate_centroid(label, class_num):
centroid = torch.zeros(1).cuda()
count = torch.zeros(class_num).cuda()
for i in range(class_num):
mask = (label == i)
count[i] = torch.sum(mask).cuda()
if count[i] > 0:
centroid += torch.sum(mask.float() * label) / count[i]
return centroid
3、出现了ValueError
ValueError: too many values to unpack (expected 4)
出现ValueError: too many values to unpack (expected 4)是因为返回值的数量超过了此时我接收返回值的变量的数量,需要重新修改接收变量的数量。
解决方法:增加接受变量的数量。
s_output, t_output, t_output1, t_output2 = model(data, data, target, mode='ec')
经过model产生的返回值实际有五个,需要增加一个变量来接收返回值
s_output, t_output, t_output1, t_output2, t_output3= model(data, data, target, mode='ec')