Pytorch 基础知识总结(一)

1. 理解 Pytorch 的张量类型

  • Pytorch中使用的数据结构为张量 - Tensor,可以表示一个标量,一个向量,一个矩阵,或是更高维度的数组。

  • 在深度神经网络中,基于Pytorch的相关计算和优化都是在Tensor的基础上完成的。

  • Pytorch中的张量结构与Numpy中的ndarray类似,共有底层内存,因而可以方便地进行相互转化。

  • Numpy仅支持CPU计算,而Pytorch支持GPU计算,并可以进行自动微分。

  • Torch中的CPU和GPU张量分别有8种数据类型:
    Pytorch 基础知识总结(一)_第1张图片

通过torch.get_default_dtype()可以查看到,torch的默认数据类型为32位浮点数。

通过torch.set_default_tensor_type()也可修改默认数据类型,但默认数据类型只能为浮点数。

2. Tensor的创建

常用创建张量主要有4个思路:
1)只创建空的占位张量
2)通过列表直接传入值,再用.reshape()方法构造形状
3)生成符合概率分布的随机数传入张量
4)生成有序或乱序的一列数传入张量

创建一个空的张量

创建空张量,即不给张量赋值,仅占用内存,返回的张量元素值即为未经初始化的内存数据。

import torch
T = torch.empty(2,3)
print(T,id(T.storage()))

通过传入python列表创建张量

可以通过 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])

3. 张量的两个常用方法

  • 查看形状:.size()方法
  • 计算包含元素总数:.numel()方法
t1 = torch.tensor([1.2,2.4,5.2,7.1,4.5,2.6])
t1 = t1.reshape((2,3))
t1.size()
t1.numel()

4. 张量的两个常用参数

  • dtype:指定数据类型
  • requires_grad = bool:指定该张量在后续计算中是否需要求梯度
'''例:生成一个需要计算梯度的一维张量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

5. 与Numpy的相互转化

将Numpy数组N转化为Pytorch张量使用两个函数:

  1. torch.as_tensor(N)
  2. torch.from_numpy(N)

由于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()

6. 应用示例

构建一个带有随机噪声的线性分布数据集:

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()

Pytorch 基础知识总结(一)_第2张图片

你可能感兴趣的:(Pytorch深度学习,pytorch)