1.IndexError: invalid index of a 0-dim tensor. Use tensor.item() to convert a 0-dim tensor to a Python number
报错原因:
running_loss += loss.data[0] 是pytorch0.3版本代码,在0.4-0.5版本的pytorch会出现警告,不会报错,但是在0.5版本以上就会报错,版本更新问题。
解决方法:
# 将原语句:
running_loss += loss.data[0]
# 修改为:
running_loss += loss.item()
2. TypeError: backward() got an unexpected keyword argument ‘retain_variables’
报错原因:
在新版本的Pytorch下,原来的变量retain_variables被替换成了retain_graph。因此,在调用位置将其替换即可。
解决办法:
backward()中默认 retain_graph=False,即反向传播之后这个计算图的内存会被释放,这样就没办法进行第二次反向传播了。需要设置为 retain_graph=True,
loss.backward(retain_graph=True)
3.TypeError: ‘int’ object is not subscriptable
报错原因:
不支持索引对象使用索引。具体来说是,不能在常量上使用索引,在一维数组上使用二维索引等。
解决办法:
# pytorch查看数据类型和维度
print(type(predict_label), predict_label.size(), list(predict_label.size()))
4.RuntimeError: output with shape [1, 28, 28] doesn’t match the broadcast shape [3, 28, 28]
报错原因:图片格式问题,灰度图只有一个channel,需要变成RGB图才可以。
解决办法1:
# 将原语句:
transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize(mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5))
])
#修改为:
transform = transforms.Compose([
transforms.ToTensor(),
transforms.Lambda(lambda x: x.repeat(3,1,1)), # 修改位置,添加了此语句
transforms.Normalize(mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5))
])
报错原因:这是因为mnist图像都是灰度图像,只有一个通道,而transforms.Normalize 却对三个通道都归一化了。
解决办法2:
# 将原语句:
transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize(mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5))
])
# 修改为:
transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.1307,), (0.3081,))
])
5.RuntimeError: DataLoader worker (pid(s) 27292) exited unexpectedly
解决办法:
# 将原语句:
dataloader = DataLoader(mnist, batch_size=batch_size, shuffle=True,num_workers=4)
#修改为:
dataloader = DataLoader(mnist, batch_size=batch_size, shuffle=True) # 注释子进程即可