PyTorch中数据集用Tensor来表示,Tensor与Python中的List类似,但是其内部存储时以连续内存单元存储,可以通过下标计算出内存地址,然后直接读出数值,因此存取效率很高,同时由于与Numpy的内存存储基本相同,所以numpy的ndarray与Tensor之间转换,不论有多少元素,其转换只需数毫秒,非常高效。同时,Tensor可以在GPU上运行,因此比numpy的效率要高。
创建空的 x ∈ R 5 \boldsymbol{x} \in R^{5} x∈R5向量:
x = torch.empty(5)
注意此时 x \boldsymbol{x} x中的元素 x i x_{i} xi的值是对应内存地址中的值,可以是任意无意义的值。
我们同样可以生成空的任意维度的张量,例如在深度学习中经常用到的设计矩阵(Design Matrix), X ∈ R 10 × 5 X \in R^{10 \times 5} X∈R10×5,表示共有10个样本,每个样本维度为5。可以用如下代码创建:
x = torch.empty([10,5])
对于连接权值,我们通常使用随机数来初始化,在PyTorch中也有随机数初始化方法。我们先来看采用均匀分布来初始化:
W = torch.rand(5,3)
我们也可以用标准正态分布来进行初始化:
W = torch.randn(5,3)
创建元素值为0或1的张量:
b = torch.zeros(5, 3, torch.float)
c = torch.ones(5, 3, torch.double)
通过已知值初始化张量:
x = torch.tensor([1.0, 2.0, 3.0, 4.0, 5.0])
在前面我们已经提到,由于与numpy在内存存储上是共用的,所以numpy的ndarray和Tensor之间互相转换,几乎是零成本的。如下所示:
a = np.ones(5)
b = torch.from_numpy(a) # ndarray转tensor
c = torch.tensor([1.0, 2.0, 3.0])
d = c.numpy() # Tensor转ndarray
我们通常想知道Tensor的形状:
a = torch.ones(5, 3)
print(a.size())
我们以加法为例,来看加法的几种表示方式:
x = torch.ones(5,3)
y = torch.ones(5,3)
print(x+y)
print(torch.add(x, y)) # 加法函数
result = torch.empty(5, 3)
torch.add(x, y, out=result) # result返回和
print(result)
y.add_(x) # 将x加入到y中
print(y)
改变Tensor形状:
x = torch.ones(6, 3)
y = x.view(2, 9)
y_ = x.view(-1, 9) # 与上一行效果一致,第一维通过第二维推出
Tensor索引与numpy中相同,对于每一维:开始索引(0开始包含): 结束索引(不包括): 步长,并且-1代表最后一个元素,依此类推。