pytorch基本操作(待更新)

1.torch.cuda()

torch.cuda会记录当前选择的GPU,并且分配的所有CUDA张量将在上面创建。可以使用torch.cuda.device上下文管理器更改所选设备。

但是,一旦张量被分配,您可以直接对其进行操作,而不考虑所选择的设备,结果将始终放在与张量相同的设备上。

默认情况下,不支持跨GPU操作,唯一的例外copy_()。 除非启用对等存储器访问,否则对分布不同设备上的张量任何启动操作的尝试都将会引发错误。

>>> import torch
>>> x = torch.cuda.FloatTensor()
>>> x
[torch.cuda.FloatTensor with no dimension]
>>> x = torch.cuda.FloatTensor(1)
>>> x

1.00000e-02 *
 -2.1046
[torch.cuda.FloatTensor of size 1 (GPU 0)]
>>> y = torch.FloatTensor(1)
>>> y

3.4179e+22
[torch.FloatTensor of size 1]

>>> y.cuda()
3.4179e+22
[torch.cuda.FloatTensor of size 1 (GPU 0)]

>> with torch.cuda.device(1):
… a = torch.cuda.FloatTensor(1)
… b = torch.FloatTensor(1).cuda()
… c = a + b

>>> a
0
[torch.cuda.FloatTensor of size 1 (GPU 1)]

>>> b
3.4179e+22
[torch.cuda.FloatTensor of size 1 (GPU 1)]
>>> c

3.4179e+22
[torch.cuda.FloatTensor of size 1 (GPU 1)]

>>> z = a + b
>>> z

3.4179e+22
[torch.cuda.FloatTensor of size 1 (GPU 1)]

>>> j = a + x
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
 File "/home/chuchienshu/.virtualenvs/pytorch3.5/lib/python3.5/site-packages/torch/tensor.py", line 293, in __add__
 return self.add(other)
RuntimeError: arguments are located on different GPUs at /pytorch/torch/lib/THC/generated/../generic/THCTensorMathPointwise.cu:269

使用固定的内存缓冲区,当副本来自固定(页锁)内存时,主机到GPU的复制速度要快很多。CPU张量和存储开放了一个pin_memory()方法,它返回该对象的副本,而它的数据放在固定区域中。

另外,一旦固定了张量或存储,就可以使用异步的GPU副本。只需传递一个额外的async=True参数到cuda()的调用。这可以用于将数据传输与计算重叠。

通过将pin_memory=True传递给其构造函数,可以使DataLoader将batch返回到固定内存中。

2.Tensor 与 numpy 的相互转换

1.tensor⇒array

>b = a.numpy() #a为tensor

2.array⇒tensor

>b = torch.from_numpy(a)  #a为numpy的array

PyTorch中的Tensor本质上和numpy数组是一样的:Tensor是一个n维数组,并且PyTorch定义了关于Tensor的很多操作。并且Tensor和numpy一样,不知道深度学习、计算图和梯度的概念,它们都是通用的科学计算工具。但是和numpy不同的是,Torch可以利用GPU来加速数值计算

如果用numpy或者Tensor来实现神经网络,需要手动写出前向过程和反向过程。这对深度学习几乎是不可能的。好在PyTorch的包autograd提供了自动求导的功能。当使用autograd时,定义的前向网络会生成一个计算图:每个节点是一个Tensor,边表示由输入Tensor到输出Tensor的函数。沿着计算图的反向传播可以很容易地计算出梯度。在实现的时候,用到了Variable对象。Variable对Tensor对象进行封装,Variable提供了和Tensor一样的API,即能在Tensor上执行的操作也可以在Variable上执行。

https://www.jianshu.com/p/cbce2dd60120

3.Tensor 与 Variable 的相互转换

1.tensor⇒Variable

b = Variable(a) #a为tensor

2.Variable⇒tensor

b = a.data #a为numpy的array

可使用tensor.shape /variable.data.shape 来查看对应矩阵的shape

mean()
a = np.arange(6).reshape(2,3).astype(np.float32)
ta = torch.from_numpy(a)
print ta.mean(0)
###
1.5000
 2.5000
 3.5000
[torch.FloatTensor of size 3]
print torch.mean(ta, 1)
###
1
4
[torch.FloatTensor of size 2]

note:如果没有astype(np.float32),a默认为int64,所有ta就是longTensor,会报错,原因是pytorch目前只对浮点型有较好支持。

torch.LongTensor doesn’t implement stateless method mean

发表评论

电子邮件地址不会被公开。 必填项已用*标注