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计算的底层方式。

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