张量:
0阶数字
1阶向量
2阶矩阵
3阶时序等等
创建tensor
import torch
x=torch.rand(4,3)
print(x)
torch.zeros
torch.ones
torch.zeros
torch.linspace
torch.normal
基于已经有的东西进行创建。
x=x.new_ones(4,3,dtype=torch.double)
x=torch.randn_like(x,dtype=torch.float)
张量计算:
torch.add(x,y)
y.add_(x)
x.reshape()
x.view()都是改变形状的reshape
为了使得运算不会同步。进行x.clone()
广播机制(不全面进行,部分进行留存)
torch.arange(1,3).view(1,2)
自动求导:autograd
torch.tensor的核心。
如果又requires_grad ==true那么可以通过backward() 来将计算进行反向追踪。所有的梯度都会累加到.grad中。
为了防止跟踪,可以用.detach()或者 with torch.no_grad() 来进行防止。
autograd里面function也重要。
function和autograd会成为无环图。每个张量都有grad_fn属性。使用创建tensor的function导致的
eg:x=torch.rand(3,3,requires_grad=True)
由于手动创建所有x.grad_fn是None
如果tensor一个标量,那么backward()不用指代。
如果是一个向量,则需要一个形状匹配的张量。
x=torch.ones(2,2,requires_grad=True)
y=x**2
z=yy3
out=z.mean()
out.backward()
输出了d(out)/dx
print(x.grad)
out3=x.sum()
x.grad.data.zero_()
out3.backward()
print(x.grad)
问题一:这个x.grad.data.zero_()具体作用。变成零了,为何还有1的值???
问题二:y.backward(v)这里v怎么进行计算的?
也可以将代码包装到 with torch.no_grad(): 中,则无法被跟踪
with torch.no_grad():
print((x**2).requires_grad)
想修改tensor,但是不想被autograd记录,则可以对tensor.data进行操作。
(问提三:tensor.data 和tensor.clone的区别?)
并行计算:
通过os.environ的办法,进行分配。
import os
os.environ[“cuda_visible_device”]=“2”
cuda_visible_device=0,1 python train.py
(更多并行计算的问题,需要进行提问,再问
问题四,解决并行计算其他疑问。)