pytorch tip

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/Hesy_H/article/details/102166979





win安装的坑

  • powershell不支持conda,请用cmd或者其他的 ( 或者安装插件
  • pip和conda总是会出现HTTPS error(连接超时了)
    • 先试试关掉proxy,不行的话就 ↓
  • 手动下载torch的whl进行安装

修改数据without 当前操作被记录进grad中

如果是当前这个tensor不想被记录在计算图中直接利用tensor.detach( ) 或者with torch.no_grad()即可,但是这里我们只是不行保留这次操作的grad而已

  • 如果我们想要修改tensor的数值,但是又不希望被autograd记录(即不会影响反向传播),那么我么可以对tensor.data进行操作。
    在这里插入图片描述

tensor.data返回的还是一个tensor,故而也有requires_grad的属性,只不过默认为False

数据类型转换

基本数据类型

  • 定义了8种CPU张量类型和对应的GPU张量类型,CPU类型(如torch.FloatTensor)中间加一个cuda即为GPU类型(如torch.cuda.FloatTensor) 【没有加的话默认是CPU类型】
    • 32位浮点型:torch.FloatTensor。pyorch.Tensor()默认的就是这种类型
      64位浮点型:torch.DoubleTensor
      64位整型:torch.LongTensor
      32位整型:torch.IntTensor
      16位整型:torch.ShortTensor

    还有三种不常用的
    torch.HalfTensor
    torch.ByteTensor
    torch.CharTensor

数据类型转换方法

  • 使用独立的函数如tensor.int(), tensor.float()等进行转换

在这里插入图片描述

  • 使用type_as()函数,将该tensor转换为另一个tensor的type

可以同步完成转换CPU类型和GPU类型,如torch.IntTensor–>torch.cuda.floatTendor.
在这里插入图片描述

  • 使用torch.type()函数,直接显示输入需要转换的类型 [ 如果没有给参数,就返回当前参数 ]

设置和查看默认数据类型

torch.set_default_dtype( dtype d )
torch.set_default_tensor_type( tensortype t )

感觉这两个没啥区别 ,区别就是传入的参数不太一样把= =
在这里插入图片描述

torch.set_default_dtype(torch.float64)
torch.set_default_tensor_type(torch.FloatTensor)

对应的查看方式就是:
torch.get_default_dtype()
torch.get_default_tensor_type()

  • 默认的就是 torch.float(32) / torch.FloatTensor

使用np生成数据然后转换成tensor

np.random.normal获得高斯分布注意点

gussian=torch.tensor(np.random.normal(0,0.01,labels.size()),dtype=torch.float)
  • 注意,这里的dtype=torch.float一定不能丢,因为np.random.normal默认生成的是float64类型的,也就是DoubelTensor,到时候和别的不兼容 --》 pytorch不支持自动把FloatTensor转换成DoubelTensor…

np生成整数然后转换

features =torch.tensor([[1,2,3],[1,2,3]])

得到的是int64的数据类型!,所以声明的时候还是要显式写dtype=torch.float最保险(no matter 你是否觉得他会自动转换成float32 )



函数整理

tensor.index_select ( dim , indice)

根据indice在该tensor的dim维度上进行选取

tensor.sum/reduce(dim= int , keepdim= bool )

  • dim就是把第几个dim上的数字压起来
  • keepdim就似乎size里面是否还保留这个压缩起来的(因为注定是1了,其实没有信息量)

X = torch.tensor([[[1, 2, 3], [4, 5, 6], [4, 5, 6]],[[1, 2, 3], [4, 5, 6], [4, 5, 6]]])
print(X.size())
print(X)
>>> torch.Size([2, 3, 3])
>>> tensor([[[1, 2, 3],
         [4, 5, 6],
         [4, 5, 6]],

        [[1, 2, 3],
         [4, 5, 6],
         [4, 5, 6]]])

print( X.sum(dim=2,keepdim=True) )
print( X.sum(dim=2,keepdim=True).size() )
>>> tensor([[[ 6],
         [15],
         [15]],

        [[ 6],
         [15],
         [15]]]) 
>>> torch.Size([2, 3, 1])


print( X.sum(dim=1,keepdim=True) )
print( X.sum(dim=1,keepdim=True).size() )
>>> tensor([[[ 9, 12, 15]],
        [[ 9, 12, 15]]])
>>> torch.Size([2, 1, 3])

print( X.sum(dim=0,keepdim=True) )
print( X.sum(dim=0,keepdim=True).size() )
>>> tensor([[[ 2,  4,  6],
         [ 8, 10, 12],
         [ 8, 10, 12]]])
>>> torch.Size([1, 3, 3])

print( X.sum(dim=2,keepdim=False).size() )
print( X.sum(dim=1,keepdim=False).size() )
print( X.sum(dim=0,keepdim=False).size() )
>>> torch.Size([2, 3])
>>> torch.Size([2, 3])
>>> torch.Size([3, 3])

  • sum和reduce是类似的效果 --》 dim是几,加法的效果就是让这个dim压缩成1

tensor.backward( tensor= , retain_graph=false )

retain_graph决定是否会保留中间节点的梯度

torch.gather( input tensor, dim ,index,out=None, sparse_grad=False)

  • 和其他所有的函数类似,可以直接用tensor.gather( dim ,index,out=None, sparse_grad=False ) 这样调用
  • 就是在input 的tensor的第dim个维度上根据index的指示挑选出相应的值,输出的size和index是一致的
    e.g.
>>> t = torch.tensor([[1,2],[3,4]])
>>> torch.gather(t, 1, torch.tensor([[0,0],[1,0]]))
tensor([[ 1,  1],
        [ 4,  3]])

常用于交叉熵的计算中,毕竟交叉熵并不关系prob不是最大的其他分类,只关心我实际的分类你给我预测的结论

在这里插入图片描述

torch.max

  • 不能使用python自带的max()

你还以为是C语言啊。。并没有给你重载。。毕竟tensor这个数据结构是torch包里面的,自然不会给你整合到基础套件里面去= =

  • torch.max( tensor input ) --> tensor result
  • torch.max( tensor input, dim=) --> tensor result , tensor index
  • torch.max( tensor input , tensor other ) -->tensor result

torch.cat

>>> t1=torch.FloatTensor(torch.randn(2,3))
>>> t1
 
-1.9405  1.2009  0.0018
 0.9463  0.4409 -1.9017
[torch.FloatTensor of size 2x3]
>>> t2=torch.FloatTensor(torch.randn(2,2))
>>> t2
 
 0.0942  0.1581
 1.1621  1.2617
[torch.FloatTensor of size 2x2]
>>> torch.cat((t1, t2), 1)
 
-1.9405  1.2009  0.0018  0.0942  0.1581
 0.9463  0.4409 -1.9017  1.1621  1.2617
[torch.FloatTensor of size 2x5]

torch.randn

  • 生成均值为0,方差为1 的随即数 --》方差和均值已经固定好了的!

torch.Tensor.relu()

  • 并没有在官网上找到这个函数,在Tensor类里面也没找到这个函数(可能是在父类Tensor_Base里面实现的吧,但是似乎是C写的。。所以点不进去查看不了。。)
  • 官网上有个torch.nn.relu( Tensor ) 我觉得就是这个函数
    反正这里第一个参数是Tensor的函数,基本上都可以用Tensor.function()这样调用吧。。

生成随机数

  • 均匀分布torch.rand( * )
  • 标准正态分布torch.randn( * ) --> mu =0, std=1
  • 离散正态分布torch.normal(tensor means, tensor std, out=None)
  • 如果想要生成指定的高斯分布?
    利用numpy转换
torch.tensor(np.random.normal(0, 0.01, size=labels.size()), dtype=torch.float)

猜你喜欢

转载自blog.csdn.net/Hesy_H/article/details/102166979
TIP
今日推荐