numpy 和 pytorch 中,对空的 tensor 取 sum 是 0,取 mean 是 NaN!对此,numpy 会报 Runtime Warning,而 pytorch 却没有一丝提示…
对张量用 mask 之后可能会产生空的 tensor(即 mask 全是 False 没有 True),可能之前训练 loss 都正常,突然就 NaN 了。所以取 mean 前先判空。
Code
- pytorch 1.4
- numpy 1.18.0
import numpy as np
import torch
# PyTorch
a = torch.Tensor([1, 3, 5])
b = a[a % 2 == 0]
print(a, b) # tensor([1., 3., 5.]) tensor([])
# pytorch 没有一丝提醒
print(b.sum(), b.mean()) # tensor(0.) tensor(nan)
# NumPy
c = np.array([1, 3, 5])
d = c[c % 2 == 0]
print(c, d) # [1 3 5] []
# numpy 会报「RuntimeWarning: Mean of empty slice」
print(d.sum(), d.mean()) # 0 nan