我正在嘗試計算火炬張量數組的平均值和標準差。我的數據集有 720 張訓練圖像,每張圖像都有 4 個地標,其中 X 和 Y 代表圖像上的 2D 點。to_tensor = transforms.ToTensor()landmarks_arr = []for i in range(len(train_dataset)): landmarks_arr.append(to_tensor(train_dataset[i]['landmarks'])) mean = torch.mean(torch.stack(landmarks_arr, dim=0))#, dim=(0, 2, 3))std = torch.std(torch.stack(landmarks_arr, dim=0)) #, dim=(0, 2, 3))print(mean.shape)print("mean is {} and std is {}".format(mean, std))結果:torch.Size([])mean is nan and std is nan上面有幾個問題:為什么 to_tensor 不轉換 0 和 1 之間的值?如何正確計算平均值?我應該除以 255 嗎?我有:len(landmarks_arr) 720和landmarks_arr[0].shapetorch.Size([1, 4, 2])和landmarks_arr[0]tensor([[[502.2869, 240.4949], [688.0000, 293.0000], [346.0000, 317.0000], [560.8283, 322.6830]]], dtype=torch.float64)
1 回答

aluckdog
TA貢獻1847條經驗 獲得超7個贊
來自 ToTensor() 的 pytorch 文檔:
如果 PIL 圖像屬于,則將 [0, 255] 范圍內的 PIL 圖像或 numpy.ndarray (H x W x C) 轉換為 [0.0, 1.0] 范圍內形狀 (C x H x W) 的 torch.FloatTensor模式之一(L、LA、P、I、F、RGB、YCbCr、RGBA、CMYK、1)或者 numpy.ndarray 的 dtype = np.uint8
在其他情況下,返回張量而不進行縮放。
由于您的 Landmark 值不是 PIL 圖像,并且不在 [0, 255] 范圍內,因此不會應用縮放。
您的計算看起來是正確的??雌饋?,您的數據中可能有一些 NaN 值。
你可以嘗試類似的東西
for i in range(len(train_dataset)): landmarks = to_tensor(train_dataset[i]['landmarks']) landmarks[landmarks != landmarks] = 0 # this will set all nan to zero landmarks_arr.append(landmarks)
在你的循環內?;蛘咴谘h中斷言 for nan 以找到罪魁禍首:
for i in range(len(train_dataset)): landmarks = to_tensor(train_dataset[i]['landmarks']) assert(not torch.isnan(landmarks).any()), f'nan encountered in sample {i}' # will trigger if a landmark contains nan landmarks_arr.append(landmarks)
不,請參見 1)。如果您愿意,您可以除以地標的最大坐標,將它們限制為 [0, 1]。
添加回答
舉報
0/150
提交
取消