import torch
#numpy仅支持CPU,torch可GPU与微分运算
#####入门
x=torch.arange(12)#使用arange创建行向量
print(x)
print("shape:",x.shape)#访问张量的形状(沿每一个轴的长度)
print("shape[0]",x.shape[0])
#len访问张量的长度
print("张量中元素的总数:",x.numel())#张量中元素的总数(形状的所有元素乘积)
#改变张量的形状
x=x.reshape(3,-1)#自动计算行列用-1
print("改变张量的形状(自动计算行列)",x)
print("shape[0]",x.shape[0])#计算axis=0的维度
x=x.reshape(3,4)#3行4列
print("改变张量的形状",x)
#初始化
print("全零初始化",torch.zeros(2,3,4))
print("全1初始化",torch.ones(2,3,4))
print("正态分布采样(均值0,标准差1)",torch.randn(3,4))
x=torch.tensor([[2,1,3],[4,5,6],[7,8,9]])
print("为每一个元素赋予特定值",x)
#####运算符
#按元素操作
x=torch.tensor([1.0,2,4,8])
y=torch.tensor([2,2,2,2])
print(x+y,x-y,x*y,x/y)
print(torch.exp(x))
#张量连接
x=torch.arange(12,dtype=torch.float32).reshape(3,4)
y=torch.tensor([[2.0,1,4,3],[1,2,3,4],[4,3,2,1]])
print("按行(轴0)连接张量",torch.cat((x,y),dim=0))
print("按列(轴1)连接张量",torch.cat((x,y),dim=1))
print("产生二元逻辑符",x==y)
print("对x中所有元素求和",x.sum())
print("对x中所有元素求和axis=1",x.sum(axis=1))
print("对x中所有元素求和axis=0,1",x.sum(axis=[0,1]))#降维
print("保持维数不变的sum:",x.sum(axis=1,keepdims=True))
print("改变张量的形状",x.sum(axis=1,keepdims=True).shape)
print(x)
print("按照axis=0轴求平均值",x.mean(axis=0))
print(x.cumsum(axis=0))#按行方向计算累积总和
#####广播机制,复制列或者行
a=torch.arange(3).reshape(3,1)
b=torch.arange(2).reshape(1,2)
print("broadcasting:",a+b)
#####索引与切片
print("取x最后一个元素",x[-1,-1])#x[0]取第一个元素tensor([ 8., 9., 10., 11.])
x[2,3]=9
print("修改2行4列的元素为9",x)
x[1:3,:]=9
print("修改1,2行的元素为9",x)
#####节省内存
#Y=X+Y,指向新的Y内存,浪费且可能污染已有内存
#使用z[:]=expression或者x+=y
z=torch.zeros_like(y)
print("id(z)",id(z))
z[:]=x+y
print("id(z)",id(z))
print("id(x)",id(x))
x+=y
print("id(x)",id(x))
#####转换为其他python类型
A=x.numpy()
B=torch.tensor(A)
print(type(A))
print(type(B))
#将大小为1的张量转换为标量
a=torch.tensor([3.5])
print(a)
print(a.item())
print(float(a))
print(int(a))
#####点积
x=torch.arange(4,dtype=torch.float32)
y=torch.ones(4,dtype=torch.float32)
print("点积1:",torch.dot(x,y))
print("点积2:",torch.sum(x*y))
#####矩阵向量积
A=torch.arange(20,dtype=torch.float32).reshape(5,4)
C=torch.arange(20,dtype=torch.float32).reshape(5,4)
print("矩阵向量积:",torch.mv(A,x))
#####矩阵与矩阵相乘
B=torch.arange(12,dtype=torch.float32).reshape(4,3)
print("矩阵与矩阵相乘:",torch.mm(A,B))
print("哈达玛积:",A*C)
#####范数:衡量一个向量有多大
u=torch.tensor([3.0,-4.0])
print("L2范数:",torch.norm(u))
print("L1范数:",torch.abs(u).sum())#受异常值影响小
print("佛罗贝尼乌斯范数(矩阵向量的L2范数):",torch.norm(torch.ones(4,9)))
#####自动微分
x=torch.arange(4.0)
x.requires_grad_(True)#x=torch.arange(4.0,requires_grad=True)
print("x.grad",x.grad)
y=2*torch.dot(x,x)
print("y",y)
y.backward()
print("x.grad",x.grad)
x.grad.zero_()#清楚累积梯度
print("x.grad",x.grad)
y=x.sum()
y.backward()
print("x.grad",x.grad)
#当y不是标量时
x.grad.zero_()
y=x*x
y.sum().backward()
print("x.grad",x.grad)
#分步求导将y视为常数
x.grad.zero_()
y=x*x
u=y.detach()
z=u*x
z.sum().backward()
print(x.grad==u)
#####概率论
from torch.distributions import multinomial
fair_probs=torch.ones([6])/6#骰子
print("索引i处的值为i出现的次数",multinomial.Multinomial(1,fair_probs).sample())
#同一分布抽取多个样本
print("抽取10个样本",multinomial.Multinomial(10,fair_probs).sample())
#####查阅文档
print(dir(torch.distributions))
print(help(torch.ones))
1预备知识
最新推荐文章于 2024-08-23 16:53:34 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)