PyTorch入门-1

描述

资源

1.为什么选择PyTorch
  1)简洁:追求更少封装,避免重复造轮子
  2)速度:灵活性不以速度为代价
  3)易用:语法优雅,简单易学
  4)资源:社区丰富,维护及时
2.基础入门
  1)安装(pip install torch)
  2)创建tensor(PyTorch重要的数据结构)
  3)自动求导
  
import numpy as np  
import torch


#创建3行4列tensor,设置自动求导
x = torch.randn(3,4,requires_grad=True)
#输出结构
x

资源

#初始化b
b = torch.randn(3,4,requires_grad=True)
#计算t
t = x + b
#求和
y = t.sum()
#反向传播计算
y.backward()
#输出b梯度
b.grad

资源

实战一个例子(计算过程如下):

资源

#计算流程
x = torch.rand(1)
b = torch.rand(1, requires_grad = True)
w = torch.rand(1, requires_grad = True)
y = w * x 
z = y + b 
#如果不清空会累加起来
z.backward(retain_graph=True)
#w梯度
w.grad

资源

#b梯度
b.grad

资源

3.搭建线性回归模型
  1)构造数据
  2)初始化参数
  3)前向传播
  4)模型训练
  5)预测结果
  6)保存模型
#初始化x值
x_values = [i for i in range(11)]
#转换为ndarray
x_train = np.array(x_values, dtype=np.float32)
#维度转换
x_train = x_train.reshape(-1, 1)
#查看形状,(11,1)
x_train.shape


#计算y值
y_values = [2*i + 1 for i in x_values]
#转换为ndarray
y_train = np.array(y_values, dtype=np.float32)
#维度转换
y_train = y_train.reshape(-1, 1)
#查看形状,(11,1)
y_train.shape
import torch
import torch.nn as nn


#线性回归模型(本质是一个不加激活函数的全连接层)
class LinearRegressionModel(nn.Module):
    #初始化参数
    def __init__(self, input_dim, output_dim):
        super(LinearRegressionModel, self).__init__()
        self.linear = nn.Linear(input_dim, output_dim)  
    #前向传播
    def forward(self, x):
        out = self.linear(x)
        return out


#输入维度
input_dim = 1
#输出维度
output_dim = 1
#初始化模型
model = LinearRegressionModel(input_dim, output_dim)
#轮数
epochs = 1000
#学习率
learning_rate = 0.01
#随机梯度下降算法
optimizer = torch.optim.SGD(model.parameters(), 
                            lr=learning_rate)
#定义均方损失函数
criterion = nn.MSELoss()


#遍历每一轮(这里使用CPU进行训练,建议使用GPU速度快)
for epoch in range(epochs):
    #计算轮数
    epoch += 1
    #注意转换成tensor
    inputs = torch.from_numpy(x_train)
    labels = torch.from_numpy(y_train)
    #梯度要清零每一次迭代
    optimizer.zero_grad() 
    #前向传播
    outputs = model(inputs)
    #计算损失
    loss = criterion(outputs, labels)
    #返向传播
    loss.backward()
    #更新权重参数
    optimizer.step()
    #每50轮输出损失值
    if epoch % 50 == 0:
        print('epoch {}, loss {}'.format(epoch, loss.item()))

资源

#预测训练数据集
predicted = model(torch.from_numpy(x_train).requires_grad_()).data.numpy()
#输出结果,跟我们真实y值几乎没有差别
predicted

资源

#保存模型
torch.save(model.state_dict(), 'model.pkl')
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分