目录
1 问题描述
2 EDA分析
3 解决方案
今天在使用transforms.Normalize((0.5,), (0.5,))对MNIST数据集中的图像进行归一化时,程序执行到这里异常退出了,
提示:
Process finished with exit code -1073741676 (0xC0000094)
我自己写了一段代码,进行测试是没有问题的:
import torchvision.transforms as transforms
import numpy as np
im1 = np.random.rand(28,28)
im1 = np.expand_dims(im1, axis=2)
# 首先进行.ToTensor()的变换
f1 = transforms.ToTensor()
im1 = f1(im1)
im1.shape
# Out[10]:
# torch.Size([1, 28, 28])
# 然后进行规范化的变换
f2 = transforms.Normalize((0.5,), (0.5,))
im2 = f2(im1)
im2.shape
# Out[11]:
# torch.Size([1, 28, 28])
所以我感觉可能是数据的问题导致的;
我先测试的时候怀疑是数据的问题,于是用EDA分析了一下,果然重现出这个Bug,
重现代码如下:
import numpy as np
a = np.random.randint(0, 255, (28, 28),dtype=np.int64)
a.shape
# Out[1]:
# (28, 28)
# 增加维度Channel
im1 = a
im1 = np.expand_dims(im1, axis=2)
im1.shape
# Out[2]:
# (28, 28, 1)
# 进行.ToTensor()的变换
import torchvision.transforms as transforms
f1 = transforms.ToTensor()
im2 = f1(im1)
im2.shape
# Out[3]:
# torch.Size([1, 28, 28])
# 获得规范化的变换
f2 = transforms.Normalize((0.5,), (0.5,))
f2
# Out[4]:
# Normalize(mean=(0.5,), std=(0.5,))
# 对数据进行规范化处理
im3 = f2(im2)
print("Finish")
# (没有输出,并且Notebook提示“Dead kernel”,也就是核进程崩溃了)
如图所示,
于是我们对Bug进行归纳:
PyTorch中的transforms.Normalize((0.5,), (0.5,))函数无法对np.int64类型的图像矩阵数据进行操作,否则核进程会崩溃,具体原因未知;
已经提交到GitHub上:
https://github.com/pytorch/pytorch/issues/31420#issue-539643449
在进行归一化的操作之前,先将torch.Tensor的类型转换为Porch默认的数据类型Float;
使用torch.Tensor.float()函数,
以下是测试代码:
# 对数据进行规范化处理
im2 = im2.float()
im3 = f2(im2)
print("Finish")
然后就可以正常运算了,如图所示,