win安装的坑
安装pytorch
- powershell不支持conda,请用cmd或者其他的 ( 或者安装插件
- pip和conda总是会出现HTTPS error(连接超时了)
- 先试试关掉proxy,不行的话就 ↓
- 手动下载torch的whl进行安装
安装tensorboardX
当然,一切的前提还得是有torch
pip install tensorboardX # 注意 先安装tensorboard再安装tensorflow ( 似乎是有版本是上的问题
pip install tensorflow
- 如果上面的不行 再试试tb-nightly吧
按照这个stackoverflow
修改数据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 - 32位浮点型:torch.FloatTensor。pyorch.Tensor()默认的就是这种类型。
数据类型转换方法
- 使用独立的函数如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)