Pytorch小知識點

x = torch.tensor([1,2,3]), y=torch.tensor([4,5,6]).cuda(0)
(1)tensor to numpy: x.numpy() or y.cpu().numpy
(2)numpy to tensor: torch.from_numpy()
(2.1)a=torch.from_numpy(b),b改變會影響a,a的dtype=torch.float64
(2.2)b = a.numpy(), 改變b將改變a
(2.3)a=torch.FloatTensor(b),b改變不影響a,a的dtype=torch.float32
(3)tensor to list: list(x.numpy())
(4)共享內存:z=x[0] or z=x[0:1] or z=x[torch.tensor(0)],z非常量時,改變z將改變x.
(4.1)a = np.zeros((2,3)), b=a[0], 改變b會影響a
(4.2)b = a.cuda(0), c = b.cpu(), a,b,c三者互不影響
(5)不共享內存:z=x[[0]] or z=x[torch.tensor([0])],改變x[0]不會改變z
(6)作爲索引的tensor須爲Long型,上述因0是整數,默認是Long型。也可以顯式定義z=x[torch.LongTensor([0.0])]
(7)torch.max(x)返回最大值tensor(3),torch.max(x,dim=0)返回最大值及其索引(tensor(3),tensor(2))
(8)對要更新的參數及其學習率等,可手動在OPTIMIZER.param_groups中添加修改,務必將參數作爲列表等的元素,使可迭代!如OPTIMIZER.param_groups[0][‘params’] = [ HEAD.weight ]
(9) 對於pytorch,train_loader = torch.utils.data.DataLoader(),不用reset;對於mxnet,train_loader = mx.io.PrefetchingIter(train_loader),務必在每個epoch開始時要reset()
(10)可以直接將tensor賦值給numpy ndarray,反過來不行
tensor: a.shape = a.size(),都對應形狀
numpy: a.shape是形狀,a.size是元素個數
(11)擴展單張圖片維度 image = cv2.imread(img_path) # image是np.ndarray
法一
image = torch.tensor(image)
img = image.view(1, *image.size()) # torch.tensor
法二
img = image[np.newaxis, :, :, :] # numpy.ndarray
法三
image = torch.tensor(image)
img = img.unsqueeze(dim=0) # torch.tensor
法四
image = np.expand_dims(image,axis=0) # numpy.ndarray
(12)輸入logits(nxc)和label(n),計算logpt = F.log_softmax(logits, dim=1)後,取出概率矩陣logpt中GT對應值的兩種方式:

  1. logpt = logpt.gather(1, label.unsqueeze(1)).view(-1)
    CEloss = - logpt.mean()
  2. one_hot = torch.zeros(n, c).scatter_(1, label.view(-1, 1), 1)
    CEloss = - (logpt * one_hot).sum(1).mean()

(13)transforms.ToTensor(): 轉化PIL_image或者np.uint8的HxWxC的numpy_ndarray,否則保留原值不變
(14)loss.backward(torch.ones(loss.shape)) # 可以實現非標量loss的梯度反傳,傳入的參數作爲與梯度相乘的係數,這裏傳入1,所以不改變梯度值;進一步,如果loss[0]和loss[1]的計算都涉及輸入x[0],則backward()後,x[0]處的梯度是loss[0]和loss[1]對x[0]梯度的累加值,舉例:
a = torch.tensor([1.0,2.0],requires_grad=True)
b = torch.tensor([0.5,0.8],requires_grad=True)
c = a[0]*a[1] + b
c.backward(torch.ones(2))
b.grad # tensor([1.,1.])
a.grad # tensor([4.,2.])
(15)pytorch網絡模型固定,參數設置固定,輸入固定,GPU上多次運行竟然產生不同的特徵輸出!
—> 解決方案:主函數中設置 torch.backends.cudnn.deterministic = True;具體原因未知,應該涉及pytorch利用GPU計算的底層方式。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章