怎么做个人网站建设,wordpress软件主题,上海手机网站建设公司,免费外贸网站在线线代基础
标量
只有一个元素的张量。可以通过 x torch.tensor(3.0) 方式创建。
向量
由多个标量组成的列表#xff08;一维张量#xff09;。比如 x torch.arange(4) 就是创建了一个1*4的向量。可以通过下标获取特定元素#xff08;x[3]#xff09;#xff0c;可以通…线代基础
标量
只有一个元素的张量。可以通过 x torch.tensor(3.0) 方式创建。
向量
由多个标量组成的列表一维张量。比如 x torch.arange(4) 就是创建了一个1*4的向量。可以通过下标获取特定元素x[3]可以通过 len(x) 获取长度可以通过 x.shape 获取形状。
矩阵
二维张量比如 reshape(a,b) 后得到的张量。
可以通过 X.T 转置。
张量运算
相同形状的张量二元运算是标量向量矩阵运算的扩展。
加法所有元素分别求和。
乘法对应位置元素分别相乘。
加标量/乘标量所有元素分别加/乘标量。
降维
sum() 是可以实现降维操作的。A.sum() 是直接沿所有维度求和得到一个标量。还可以指定维度求和进行降维。
A
# Output
(tensor([[ 0., 1., 2., 3.],[ 4., 5., 6., 7.],[ 8., 9., 10., 11.],[12., 13., 14., 15.],[16., 17., 18., 19.]]),A_sum_axis0 A.sum(axis0)
A_sum_axis0, A_sum_axis0.shape
# Output
(tensor([40., 45., 50., 55.]), torch.Size([4]))A_sum_axis1 A.sum(axis1)
A_sum_axis1, A_sum_axis1.shape
# Output
(tensor([ 6., 22., 38., 54., 70.]), torch.Size([5]))A.sum(axis[0, 1]) # 结果和A.sum()相同
# Output
tensor(190.)总和也可以用 A.mean() 或者 A.sum()/A.numel() 来算。
也可以利用 A.mean(axis0) 或 A.sum(axis0)/A.shape[0] 来降低维度。
非降维求和
sum_A A.sum(axis1, keepdimsTrue)
sum_A
# Output
tensor([[ 6.],[22.],[38.],[54.],[70.]])A / sum_A # 广播操作
# Output
tensor([[0.0000, 0.1667, 0.3333, 0.5000],[0.1818, 0.2273, 0.2727, 0.3182],[0.2105, 0.2368, 0.2632, 0.2895],[0.2222, 0.2407, 0.2593, 0.2778],[0.2286, 0.2429, 0.2571, 0.2714]])A.cumsum(axis0) # 按行求和且不降维
# Output
tensor([[ 0., 1., 2., 3.],[ 4., 6., 8., 10.],[12., 15., 18., 21.],[24., 28., 32., 36.],[40., 45., 50., 55.]])矩阵乘法
左矩阵逐列和右矩阵逐行相乘。
torch.mv(a,b)
范数
向量的大小。
L1范数各个分量绝对值长度求和。
L2范数欧几里得长度比如二维向量是a2b2 开根。
Frobenius范数矩阵中每一个元素的平方和开根。
微积分
微分
导数的基本概念就不详细叙述了这是大学必修课。
常用公式 自动微分
python 里是自动求导一个函数在指定值上做求导。 正向传递如上图先计算 w 关于 x 的导数在计算 b 关于 a 的导数……
反向传递全过程正好相反先计算 z 关于 b 的导数再计算 b 关于 a 的导数……
正向反向累积的时间复杂度都是 O(N)但是正向空间复杂度是 O(1)反向一直要把所有的中间结果记录下来空间复杂度 O(N)。
显示构造先定义公式再赋值。 隐式构造pytorch 采用的是这种方案。 下面展开一个具体的计算例子。比如我们要计算 y2x2 的导数。
# 先创建 x
from mxnet import autograd, np, npx
npx.set_np()
x np.arange(4.0) #[0. ,1. ,2. ,3.]
x.requires_grad_(True) # 等价于xtorch.arange(4.0,requires_gradTrue)
# 在计算关于x的梯度后将能够通过grad属性访问它它的值被初始化为 [0. ,0. ,0. ,0.]
y 2 * torch.dot(x, x)
y.backward()
x.grad # [0. ,4. ,8. ,12.]
# y 的导数在这几个点上应该是 4x。验证一下是否正确
x.grad 4 * x # [True,True,True,True]# 再算一下另一个函数
x.grad.zero_() # 清零
yx.sum() # x_1x_2...x_n
y.backward()
x.grad # [1. ,1. ,1. ,1.]x.grad.zero_() # 清零
y x * x # y是一个向量注意这里是哈马达积和前面的点积不一样。点积得到的是一个标量这个是每个x对应彼此相乘得到的1*4的向量
# 等价于y.backward(torch.ones(len(x)))
y.sum().backward()
x.grad # 等价于ysum(x*x) [0. ,2. ,4. ,8.]# 分离计算比如zu*x, ux*x但是我们不想把 u 展开求导我们期望对 z 求 x 导数得到 u
x.grad.zero_()
y x * x
u y.detach() # 相当于 requires_grad False不会得到梯度
z u * x
z.sum().backward()
x.grad u# 自动微分也可以计算包含条件分支的分段。以下分段本质上都是k*a。
def f(a):b a * 2while b.norm() 1000:b b * 2if b.sum() 0:c belse:c 100 * breturn c
a torch.randn(size(), requires_gradTrue)
d f(a)
d.backward()
a.grad d / a # True