使用transforms.Normalize((0.5,), (0.5,))异常报错“Process finished with exit code -1073741676 (0xC0000094)”

目录

1 问题描述

2 EDA分析

3 解决方案


1 问题描述

今天在使用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])

所以我感觉可能是数据的问题导致的;

2 EDA分析

我先测试的时候怀疑是数据的问题,于是用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”,也就是核进程崩溃了)

如图所示,

使用transforms.Normalize((0.5,), (0.5,))异常报错“Process finished with exit code -1073741676 (0xC0000094)”_第1张图片

于是我们对Bug进行归纳:

PyTorch中的transforms.Normalize((0.5,), (0.5,))函数无法对np.int64类型的图像矩阵数据进行操作,否则核进程会崩溃,具体原因未知;

已经提交到GitHub上:

https://github.com/pytorch/pytorch/issues/31420#issue-539643449

3 解决方案

在进行归一化的操作之前,先将torch.Tensor的类型转换为Porch默认的数据类型Float

使用torch.Tensor.float()函数,

以下是测试代码:

# 对数据进行规范化处理
im2 = im2.float()
im3 = f2(im2)
print("Finish")

然后就可以正常运算了,如图所示,

使用transforms.Normalize((0.5,), (0.5,))异常报错“Process finished with exit code -1073741676 (0xC0000094)”_第2张图片

你可能感兴趣的:(PyTorch学习,目标检测)