一、N维数组样例
- N维数组是机器学习和神经网络学习的主要数据结构
- N维数组样例
4维数组通常是n个三位数组放在一起,例如一个RGB图片的批量,5维数组,比如一个视频的批量,除了有很多图片还有一个时间的维度。
1、创建数组
- 创建数组需要
- 形状:例如3*4矩阵
- 每一个元素的数据类型:例如32位浮点数
- 每一个元素的值,例如全是0,或者随机数
2、数组中元素的访问
- 访问一个元素
- 元素的访问时我们可以通过指定数组的下标访问数组中的某一个元素,比如图片中的第一个案例。
- 访问一行或一列数据
- 通过指定数据访问我们需要的哪一行或者一列数据,例如图中的2,3。
- 访问子区域
- 通过指定行和列的区间范围,以及行列之间的间隔来获取子区域的元素。
二、数据操作
1.简单的数据操作
首先导入torch
import torch
张量表示一个数值组成的数组,这个数组可能有多个维度。
x=torch.arange(12)
我们可以通过张量的shape属性来访问张量的形状和张量中元素的总数。
x.shape #形状
x.numel() #总数
要先发改变一个张量的形状而不改变元素数量和元素值,我们可以调用reshape函数
X=x.reshape(3,4)
使用全0、全1、其他常量或者从特定分布中随机采样的数字
torch.zeros((2,3,4))#全0
torch.ones((2,3,4))#全1
通过提供包含数值的Python列表(或嵌套列表)来为所需张量中的每一个元素赋予确定值
torch.tensor([[2,1,4,3],[1,2,3,4],[4,3,2,1]])
常见的标准算术运算符(+、-、*、/和**)都可以被升级为按元素运算
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],[1,2,3,4],[4,3,2,1]])
torch.cat((X,Y),dim=0) #按行合并
torch.cat((X,Y),dim=1) #按列合并
通过逻辑运算符构建二元张量
X==Y
此时结果中的元素只有True和False两种结果。
对张量中的所有元素进行求和会产生一个只有一个元素的张量
X.sum()
即使操作的两个张量的形状不同,我们任然可以通过调用广播机制(broadcasting mechanism)来执行按元素操作。后面会对广播机制进行详细的解释。
- 元素的访问
可以用[-1]选择最后一个元素,也可以用[1:3]访问第二个和第三个元素
X[-1],X[1:3]
处理读取外,我们还可以通过指定索引来将元素写入矩阵。
X[1,2]=9 #把第一行第二列的数值写作9
为多个元素赋值相同的值,我们只需要索引所有元素,然后为它们赋值。
X[0:2,:]=12 #把 0,1行,所有列的所有数值赋值为12
运行一些操作可能会导致新结果分配内存
before=id(Y)
Y=Y+X
id(Y)==before
我们得到的结果为False,如果我们不想产生新的内存只执行原地操作
z=torch.zeros_like(Y)
print('id(z):',id(z))
Z[:]=X+Y
print('id(Z):',id(Z))
转化为Numpy张量
A=X.numpy()
B=torch.tensor(A)
type(A),type(B)
此时我们得到的结果为(numpy.ndarray,torch.Tensor)
将大小为1的张量转换成Python标量
a=torch.tensor([3,5])
a,a.item(),float(a),int(a)
2.广播机制
1.广播机制定义
- 如果一个PyTorch操作支持广播,则其Tensor参数可以自动扩展为相等大小(不需要复制数据)。通常情况下,小一点的数组会被 broadcast 到大一点的,这样才能保持大小一致。
2.广播机制规则 - 如果遵守以下规则,则两个tensor是“可广播的”:
- 每个tensor至少有一个维度
- 遍历tensor所有维度时,从末尾随开始遍历,两个tensor存在下列情况:
- tensor维度相等。
- tensor维度不等且其中一个维度为1。
- tensor维度不等且其中一个维度不存在。
- 如果两个tensor是“可广播的”,则计算过程遵循下列规则:
- 如果两个tensor的维度不同,则在维度较小的tensor的前面增加维度,使它们维度相等。
- 对于每个维度,计算结果的维度值取两个tensor中较大的那个值。
- 两个tensor扩展维度的过程是将数值进行复制。
实例说明:
a=torch.arange(3).reshape((3,1))
b=torch.arange(2).reshape((1,2))
a,b
a+b