gpt4 book ai didi

python - 为什么我在这里得到除以零的错误?

转载 作者:行者123 更新时间:2023-12-05 02:06:41 33 4
gpt4 key购买 nike

所以我正在关注这个 tutorial in the docs在自定义数据集上。我使用的是 MNIST 数据集,而不是教程中的奇特数据集。这是我写的 Dataset 类的扩展:

class KaggleMNIST(Dataset):

def __init__(self, csv_file, transform=None):
self.pixel_frame = pd.read_csv(csv_file)
self.transform = transform

def __len__(self):
return len(self.pixel_frame)

def __getitem__(self, index):
if torch.is_tensor(index):
index = index.tolist()

image = self.pixel_frame.iloc[index, 1:]
image = np.array([image])

if self.transform:
image = self.transform(image)

return image

它有效,直到我尝试对其使用转换:

tsf = transforms.Compose([transforms.ToTensor(), 
transforms.Normalize((0.5,), (0.5,))
])

trainset = KaggleMNIST('train/train.csv', transform=tsf)

image0 = trainset[0]

我查看了堆栈跟踪,似乎规范化发生在这行代码中:

c:\program files\python38\lib\site-packages\torchvision\transforms\functional.py in normalize(tensor, mean, std, inplace)
--> 218 tensor.sub_(mean[:, None, None]).div_(std[:, None, None])

所以我不明白为什么要除以零,因为 std 应该是 0.5,远不及一个小值。

感谢您的帮助!

编辑:

这并没有回答我的问题,但我发现如果我更改这些代码行:

image = self.pixel_frame.iloc[index, 1:] 
image = np.array([image])

image = self.pixel_frame.iloc[index, 1:].to_numpy(dtype='float64').reshape(1, -1)

基本上,确保数据类型是 float64 就解决了这个问题。我仍然不确定问题最初存在的原因,所以我仍然很乐意得到一个解释清楚的答案!

最佳答案

读取数据的dtypeint64

img = np.array([pixel_frame.iloc[0, 1:]])
img.dtype
# output
dtype('int64')

这会强制将 mean 和 std 转换为 int64,并且当 std 为 0.5 时,它变为 0,并引发以下错误:

>>> tsf(img)
ValueError: std evaluated to zero after conversion to torch.int64, leading to division by zero.

这是因为均值和标准差在归一化过程中被转换为数据集的dtype

def normalize(tensor, mean, std, inplace=False):
...
dtype = tensor.dtype
mean = torch.as_tensor(mean, dtype=dtype, device=tensor.device)
std = torch.as_tensor(std, dtype=dtype, device=tensor.device)
if (std == 0).any():
raise ValueError('std evaluated to zero after conversion to {}, leading to division by zero.'.format(dtype))

这就是将 dtype 转换为 float 修复错误的原因。

关于python - 为什么我在这里得到除以零的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62559389/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com