Pytorch中使用的数据结构为张量 - Tensor,可以表示一个标量,一个向量,一个矩阵,或是更高维度的数组。
在深度神经网络中,基于Pytorch的相关计算和优化都是在Tensor的基础上完成的。
Pytorch中的张量结构与Numpy中的ndarray类似,共有底层内存,因而可以方便地进行相互转化。
Numpy仅支持CPU计算,而Pytorch支持GPU计算,并可以进行自动微分。
通过torch.get_default_dtype()
可以查看到,torch的默认数据类型为32位浮点数。
通过torch.set_default_tensor_type()
也可修改默认数据类型,但默认数据类型只能为浮点数。
常用创建张量主要有4个思路:
1)只创建空的占位张量
2)通过列表直接传入值,再用.reshape()
方法构造形状
3)生成符合概率分布的随机数传入张量
4)生成有序或乱序的一列数传入张量
创建空张量,即不给张量赋值,仅占用内存,返回的张量元素值即为未经初始化的内存数据。
import torch
T = torch.empty(2,3)
print(T,id(T.storage()))
可以通过 torch.tensor()
和torch.Tensor()
两个函数直接传入python列表创建torch张量。
t1 = torch.tensor([1.2,2.4,5.2,7.1,4.5,2.6])
t1.reshape(2,3)
t2 = torch.Tensor([1,2,3,4])
不同的是,torch.Tensor()
还可以直接接受形状参数,创建指定形状的随机张量。
t3 = torch.Tensor(2,3)
在生成随机数之前一般需要通过torch.manual_seed()
指定随机种子来使结果可以复现。
生成在区间 [ 0 , 1 ] [0,1] [0,1] 上服从均匀分布的随机数构成的 2 × 3 2\times3 2×3 张量:
torch.rand(2,3)
生成服从标准正态分布的随机数构成的 2 × 3 2\times3 2×3 张量:
torch.randn(2,3)
生成服从指定均值和标准差的正态分布的随机数构成的张量,指定多少个均值或标准差参数,就生成多少个张量元素,注意标准差必须为浮点型张量。
torch.normal(mean=0,std=torch.tensor(1.0))
torch.normal(mean=1,std=torch.arange(0,10.0))
torch.normal(mean=torch.arange(0,5.0),std=torch.arange(0,5.0))
创建一个 [ 0 , n ) [0,n) [0,n) 区间的整数随机排序构成的张量:
torch.randperm(10)
tensor([5, 6, 3, 8, 9, 4, 7, 0, 1, 2])
按起始,结束,步长创建序列数构成的张量:
torch.arange(start=0.,end=10.,step=2)
tensor([0., 2., 4., 6., 8.])
指定起始,结束,元素个数,生成等间隔序列张量:
torch.linspace(start=0,end=10,steps=2)
tensor([ 0., 10.])
指定起始指数,结束指数,元素个数,生成 1 0 i 10^i 10i序列张量:
torch.logspace(stat=0.1,end=1.0,steps=5)
tensor([ 1.2589, 2.1135, 3.5481, 5.9566, 10.0000])
t1 = torch.tensor([1.2,2.4,5.2,7.1,4.5,2.6])
t1 = t1.reshape((2,3))
t1.size()
t1.numel()
'''例:生成一个需要计算梯度的一维张量B,
B包含元素为1,2,3,
指定B的数据类型为32位浮点型,
计算B向量平方和在B每个元素上的梯度'''
# 指定B的数据类型,指明B需要求梯度
B = torch.tensor([1,2,3],dtype = torch.float,requires_grad = True)
# 向量B的平方和等于B与自身的点积,将标量输出赋值给y
y = torch.dot(B,B)
# 调用反向传播函数来自动计算y关于B向量每个分量的梯度
y.backward()
# 打印B的梯度
B.grad
将Numpy数组N转化为Pytorch张量使用两个函数:
由于Numpy数组的默认数据类型为64位浮点数,转换后的张量数据类型依然为64位浮点数。
import numpy as np
F = np.ones((3,3))
Ftensor = torch.as_tensor(F)
Ftensor
N = np.zeros((2,3))
Ntensor = torch.from_numpy(N)
Ntensor
将Pytorch中的张量T转换为Numpy数组,使用**T.numpy()**方法
Ftensor.numpy()
构建一个带有随机噪声的线性分布数据集:
def artificial_data(w,b,num_examples):
X = torch.normal(0,1,(num_examples,len(w)))
#对b使用广播机制
y = torch.matmul(X,w)+b
y += torch.normal(0,0.01,y.shape)
return X,y
#将w设定值的行向量转化为列向量
w_in = torch.tensor([1.,2.5]).reshape((-1,1))
b_in = 3.2
In,out = artificial_data(w_in,b_in,1000)
In.shape,out.shape
散点图预览:
from matplotlib import pyplot as plt
plt.scatter(In[:,1].detach().numpy(),out.detach().numpy(),1)
plt.show()