PyTorch 一文入门
PyTorch 入坑一:数据类型与Tensor的概念
PyTorch数据类型
pytorch提供了九种数据类型,主要分为三大类;
第一类是float浮点数,有16位(16-bit floating point)、32位(32-bit floating point)、64位(64-bit floating point);
第二类是整型,有8位(8-int integer(unsigned),8-int integer(signed)),32位(32-bit integer(signed)),64-bit integer(signed);
第三类是布尔型数据(Boolean)。
用得最多的是32-bit floating point(卷积神经网络或者图片处理使用到)和64-bit integer(signed)(图像的标签通常用长整型进行表示)
tensor有八个属性,其中四个属性与数据相关,4个属性与梯度求导相关。
Tensor的概念
Tensor(张量)是一个多维数组,它是标量、向量、矩阵的高维拓展。
- 标量是一个零维张量,是没有方向的,是一个数。
- 一维张量只有一个维度,是一行或者一列
- 二维张量是一个矩阵,有两个维度,灰度图片就是一个二维张量
- 当图像是彩色图像(RGB)的时候,就得使用三维张量了
Tensor与Variable
Variable
-
variable是pytorch 0.4.0以前的版本中一个重要的数据类型,从pytorch0.4.0开始,variable并入到tensor 中
-
variable是torch.autograd中的数据类型,主要用于封装tensor,进行自动求导。variable主要由以下几个部分组成
- data: 被包装的tensor - grad: data的梯度 - grad_fn: 表明该变量是怎么来的,用于指导反向传播,例如loss = a+b,则loss.gard_fn为<AddBackward0 at 0x7f2c90393748>,表明loss是由相加得来的,这个grad_fn可指导怎么求a和b的导数 - requires_grad: 指示是否需要梯度 - is_leaf: 指示是否是叶子结点(张量)
Tensor
-
pytorch自0.4.0版本后将variable并入tensor中
-
在tensor中有8个部分,其中有5个部分在前面的variable中已经介绍了。剩余的3个部分分别为dtype,shape,device
- dtype: 张量的数据类型,如torch.FloatTensor, torch.cuda.FloatTensor,cuda表示数据是放到GPU上的 - shape: 张量的形状,如(64,3,224,224) - device:张量所在设备,GPU/CPU,是加速的关键
Tensor的创建
张量的创建有三大方法,第一类是直接创建,第二类是依据数值创建,第三类是依据概率创建
未完待续
PyTorch 入坑二:Tensor切分
Tensor的拼接
Tensor的切分
Tensor的索引
Tensor的变换
torch.reshape()
torch.transpose()
torch.t()
torch.squeeze()
torch.unsqueeze()
张量的数学运算
加减乘除
- torch.add()
- torch.addcdiv()
- torch.addcmul()
- torch.sub()
- torch.div()
- torch.mul()
对数,指数,幂函数
- torch.log(input,out=None)
- torch.log10(input,out=None)
- torch.log2(input,out=None)
- torch.exp(input,out=None)
- torch.pow()
三角函数
- torch.abs(input,out=None)
- torch.acos(input,out=None)
- torch.cosh(input,out=None)
- torch.cos(input,out=None)
- torch.asin(input,out=None)
- torch.atan(input,out=None)
- torch.atan2(input,other,out=None)
PyTorch 入坑三:线形回归与计算图
线性回归
求解步骤
1、确定模型 model: y = wx + b
2、选择损失函数 MSE,均方误差
3、求解梯度并更新w,b
计算图
import torch
import matplotlib.pyplot as plt
torch.manual_seed(10)
lr = 0.05 # 学习率
# 创建训练数据
x = torch.rand(20, 1) * 10 # x data (tensor), shape=(20, 1) rand是生成均匀分布的20个点,再乘于10,范围就是0-10之间
y = 1*x + (5 + torch.randn(20, 1)) # y data (tensor), shape=(20, 1),torch.randn(20, 1)是噪声,符合正态分布
# 构建线性回归参数
w = torch.randn((1), requires_grad=True) #线性函数中只有一个w,先随机初始化一个w
b = torch.zeros((1), requires_grad=True) #线性回归中只有一个b,先随机初始化b的值为0
for iteration in range(1000):
# 前向传播
wx = torch.mul(w, x) #将w和x的值相乘
y_pred = torch.add(wx, b) #计算wx + b的值
# 计算 MSE loss
loss = (0.5 * (y - y_pred) ** 2).mean() #计算损失函数
# 反向传播
loss.backward() #使用自带的梯度求导模块
# 更新参数
b.data.sub_(lr * b.grad)
w.data.sub_(lr * w.grad)
b.grad.zero_() #将张量梯度清零
w.grad.zero_() #将张量梯度清零
# 绘图
if iteration % 20 == 0: #每迭代20次进行一次输出
plt.scatter(x.data.numpy(), y.data.numpy())
plt.plot(x.data.numpy(), y_pred.data.numpy(), 'r-', lw=5)
plt.text(2, 20, 'Loss=%.4f' % loss.data.numpy(), fontdict={'size': 20, 'color': 'red'})
plt.xlim(1.5, 10)
plt.ylim(8, 28)
plt.title("Iteration: {}\nw: {} b: {}".format(iteration, w.data.numpy(), b.data.numpy()))
plt.pause(0.5)
if loss.data.numpy() < 1: #如果损失函数的值小于0.8则停止循环
break