注:本代码在jupyter notebook上运行
import torch
# 用arange创建行向量
x = torch.arange(12)
print(x)
print(x.shape) # 打印张量的形状
x.numel() # 张量的元素个数
# 用reshape函数改变张量形状(元素值不会改变)
X = x.reshape(3, 4) # 改变成3行4列的形状
print(x)# 小写x
print(X)# 大写X
# 也可以用-1调用自动计算维度的功能
X1 = x.reshape(-1, 4)
X2 = x.reshape(3, -1)
print(X1, '\n' ,X2) # reshape的结果和上面一样
# 创建全0张量 指定形状(2,3,4)
torch.zeros((2, 3, 4))
# 创建全1张量 指定形状(2,3,4)
torch.ones((2, 3, 4))
# 从均值为0、标准差为1的正态分布中随机采样创建形状为(3,4)的张量
torch.randn(3,4)
# 通过python列表为张量元素赋值,最外层列表对应轴0,内层列表对应于轴1
x = torch.tensor([[1,2,3],[4,5,6],[7,8,9]])
print(x)
print(x[2])
print(x[0][0])
print(x[[2]])
# 简单的按元素运算
x = torch.tensor([1.0, 2, 4, 8])
y = torch.tensor([2, 2, 2, 2])
x + y, x - y, x * y, x / y, x ** y # 加 减 乘 除 求幂
torch.exp(x)
# 张量拼接
X = torch.arange(12, dtype=torch.float32).reshape((3,4))
Y = torch.tensor([[2.0, 1, 4, 3], [5, 6, 8, 9], [10, 11, 12, 13]])
torch.cat((X, Y), dim=0), torch.cat((X, Y), dim=1) # 按行拼接、按列拼接
# 通过逻辑运算构建张量
# 判断张量x和y在对应位置是否相等,若对应位置相等则新张量在该位置值为1,否则为0
X == Y
# 对张量所有位置求和,产生一个单元素张量
X.sum()
# 广播机制,通过复制元素扩展数组,使转换后的张量具有相同的形状
# 对生成的数组执行按元素操作
X = torch.arange(3).reshape((3,1))
Y = torch.arange(2).reshape((1,2))
print(X, '\n', Y)
Z = X+Y
print(Z)
# 索引和切片
Z[-1], Z[1:3] # 最后一个元素,第二个和第三个元素
# 通过索引将指定元素写入
print(Z)
Z[1,1] = 0
print(Z)
# 多个元素赋相同的值
Z[:,0] = 6 # :表示所有行,0表示第一个元素,合在一起就是第一列
Z
# 节省内存问题
before = id(Y)
Y = Y + X
id(Y) == before
Z
# 这并不是符合我们的期待
# 模型参数巨大,且在短时间内多次更新,我们预期的是原地执行更新
# 不执行原地更新,其他引用会指向旧的内存位置,某些代码可能会无意中引用到旧的参数
# 如何解决:切片表示法
Z = torch.zeros_like(Y)# 创建一个形状像Y的全0矩阵
print("id(Z)", id(Z))
Z[:] = X+Y
print("id(Z)", id(Z))
# 可以发现变量Z实现了原地更新
# 另一种方法 Z += Y
print("id(Z)", id(Z))
Z += Y
print("id(Z)", id(Z))
# 转化为其他python对象
A = X.numpy() # tensor转化为NumPy张量(ndarray)
B = torch.tensor(A)# NumPy张量转化为tensor
type(A), type(B)
# 大小为1的张量转化为Python标量
a = torch.tensor([2.5])
a, a.item(), float(a), int(a)
所有源码均可下载https://download.csdn.net/download/weixin_50995339/89615342
欢迎交流学习。