https://zh.d2l.ai/chapter_preliminaries/index.html
一些基本的:
x = torch.arange(12)创建行向量;x.shape求形状;x.numel()元素的总数;torch.zeros(),torch.ones()创建全零全一;torch.randn(3,4)创建随机的34矩阵;torch.tensor([[2, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])也可以手动写;
A.sum()求和;A.sum(axis=i)根据第i个轴求和;A.mean()求平均;A.sum(axis=i, keepdims=*True)非降维求和;A.cumsum(axis=i)沿某个轴计算A元素的累积总和,不会改变维度;torch.dot(x, y)向量点积;torch.mv(A, x)矩阵 向量积;torch.mm(A, B)矩阵矩阵积;torch.norm(u)范数,
常用导数:
《微分自动微分》
import torch
x=torch.arange(4.0)
x.requiresgrad(True)#首先要创建空间
y=2*torch.dot(x,x)
y.backward()#要进行反向传递操作
print(x.grad)
#非标量变量的反向传播,当我们对向量值变量y(关于x的函数)调用backward时,将通过对y中的元素求和来创建 一个新的标量变量。然后计算这个标量变量相对于x的梯度
x.grad.zero()#每次使用要清零更新
y=2x
y.sum().backward()*#当y不是一个标量时,这样求导,但一般不用。
print(x.grad)
#为什么深度学习一般都是对标量求导而不是对向量或者矩阵,因为要用的loss一般是个标量,是向量或者矩阵会很麻烦。
# 分离计算_
y = x x
u = y.detach()#把u当作一个常数
z = u x
z.sum().backward()
print(x.grad)#=u=x**2
使用自动微分的还一个好处是: 即使构建函数的计算图需要通过Python控制流(例如,条件、循环或任意函数调用),我们仍然可以计算得到的变量的梯度。 在下面的代码中,while循环的迭代次数和if语句的结果都取决于输入a的值
def f(a):
b = a 2
while b.norm() < 1000:
b = b 2
if b.sum() > 0:
c = b
else:
c = 100 b
return c
a = torch.randn(size=(), requires_grad=*True)
d = f(a)
d.backward()
结果a.grad == d / a