码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • pytorch从零开始搭建神经网络


    目录

    基本流程

    一、数据处理

    二、模型搭建

    三、定义代价函数&优化器

    四、训练

    附录

    nn.Sequential

    nn.Module

    model.train() 和 model.eval() 

    损失

    图神经网络


    基本流程

    《PyTorch深度学习实践》完结合集_哔哩哔哩_bilibili

    1. 数据预处理(Dataset、Dataloader)

    2. 模型搭建(nn.Module)

    3. 损失&优化(loss、optimizer)

    4. 训练(forward、backward)

    一、数据处理

    对于数据处理,最为简单的⽅式就是将数据组织成为⼀个 。

    但许多训练需要⽤到mini-batch,直 接组织成Tensor不便于我们操作。

    pytorch为我们提供了Dataset和Dataloader两个类来方便的构建。

    torch.utils.data.DataLoader(dataset,batch_size,shuffle,drop_last,num_workers)
    

     

    二、模型搭建

    搭建一个简易的神经网络

    除了采用pytorch自动梯度的方法来搭建神经网络,还可以通过构建一个继承了torch.nn.Module的新类,来完成forward和backward的重写。

    1. # 神经网络搭建
    2. import torch
    3. from torch.autograd import Varible
    4. batch_n = 100
    5. hidden_layer = 100
    6. input_data = 1000
    7. output_data = 10
    8. class Model(torch.nn.Module):
    9. def __init__(self):
    10. super(Model,self).__init__()
    11. def forward(self,input,w1,w2):
    12. x = torch.mm(input,w1)
    13. x = torch.clamp(x,min = 0)
    14. x = torch.mm(x,w2)
    15. def backward(self):
    16. pass
    17. model = Model()
    18. #训练
    19. x = Variable(torch.randn(batch_n,input_data))

    一点一点地看:

    1. import torch
    2. dtype = torch.float
    3. device = torch.device("cpu")
    4. N, D_in, H, D_out = 64, 1000, 100, 10
    5. # Create random input and output data
    6. x = torch.randn(N, D_in, device=device, dtype=dtype)
    7. y = torch.randn(N, D_out, device=device, dtype=dtype)
    8. # Randomly initialize weights
    9. w1 = torch.randn(D_in, H, device=device, dtype=dtype)
    10. w2 = torch.randn(H, D_out, device=device, dtype=dtype)
    11. learning_rate = 1e-6

    tensor 写一个粗糙版本(后面陆陆续续用pytorch提供的方法)

    1. for t in range(500):
    2. # Forward pass: compute predicted y
    3. h = x.mm(w1)
    4. h_relu = h.clamp(min=0)
    5. y_pred = h_relu.mm(w2)
    6. # Compute and print loss
    7. loss = (y_pred - y).pow(2).sum().item()
    8. if t % 100 == 99:
    9. print(t, loss)
    10. # Backprop to compute gradients of w1 and w2 with respect to loss
    11. grad_y_pred = 2.0 * (y_pred - y)
    12. grad_w2 = h_relu.t().mm(grad_y_pred)
    13. grad_h_relu = grad_y_pred.mm(w2.t())
    14. grad_h = grad_h_relu.clone()
    15. grad_h[h < 0] = 0
    16. grad_w1 = x.t().mm(grad_h)
    17. # Update weights using gradient descent
    18. w1 -= learning_rate * grad_w1
    19. w2 -= learning_rate * grad_w2

    三、定义代价函数&优化器

    Autograd

    1. for t in range(500):
    2. y_pred = x.mm(w1).clamp(min=0).mm(w2)
    3. loss = (y_pred - y).pow(2).sum()
    4. if t % 100 == 99:
    5. print(t, loss.item())
    6. loss.backward()
    7. with torch.no_grad():
    8. w1 -= learning_rate * w1.grad
    9. w2 -= learning_rate * w2.grad
    10. w1.grad.zero_()
    11. w2.grad.zero_()

    对于需要计算导数的变量(w1和w2)创建时设定requires_grad=True,之后对于由它们参与计算的变量(例如loss),可以使用loss.backward()函数求出loss对所有requires_grad=True的变量的梯度,保存在w1.grad和w2.grad中。

    在迭代w1和w2后,即使用完w1.grad和w2.grad后,使用zero_函数清空梯度。
     

    nn

    1. model = torch.nn.Sequential(
    2. torch.nn.Linear(D_in, H),
    3. torch.nn.ReLU(),
    4. torch.nn.Linear(H, D_out),
    5. )
    6. loss_fn = torch.nn.MSELoss(reduction='sum')
    7. learning_rate = 1e-4
    8. for t in range(500):
    9. y_pred = model(x)
    10. loss = loss_fn(y_pred, y)
    11. if t % 100 == 99:
    12. print(t, loss.item())
    13. model.zero_grad()
    14. loss.backward()
    15. with torch.no_grad():
    16. for param in model.parameters():
    17. param -= learning_rate * param.grad

    optim

    1. optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)
    2. for t in range(500):
    3. y_pred = model(x)
    4. loss = loss_fn(y_pred, y)
    5. if t % 100 == 99:
    6. print(t, loss.item())
    7. optimizer.zero_grad()
    8. loss.backward()
    9. optimizer.step()

    四、训练

    迭代进行训练以及测试,其中训练的函数train里就保存了进行梯度下降求解的方法

    1. # 定义训练函数,需要
    2. def train(dataloader, model, loss_fn, optimizer):
    3. size = len(dataloader.dataset)
    4. # 从数据加载器中读取batch(一次读取多少张,即批次数),X(图片数据),y(图片真实标签)。
    5. for batch, (X, y) in enumerate(dataloader):
    6. # 将数据存到显卡
    7. X, y = X.to(device), y.to(device)
    8. # 得到预测的结果pred
    9. pred = model(X)
    10. # 计算预测的误差
    11. # print(pred,y)
    12. loss = loss_fn(pred, y)
    13. # 反向传播,更新模型参数
    14. optimizer.zero_grad() #梯度清零
    15. loss.backward() #反向传播
    16. optimizer.step() #更新参数
    17. # 每训练10次,输出一次当前信息
    18. if batch % 10 == 0:
    19. loss, current = loss.item(), batch * len(X)
    20. print(f"loss: {loss:>7f} [{current:>5d}/{size:>5d}]")

    设置为测试模型并设置不计算梯度,进行测试数据集的加载,判断预测值与实际标签是否一致,统一正确信息个数

    1. # 将模型转为验证模式
    2. model.eval()
    3. # 测试时模型参数不用更新,所以no_gard()
    4. with torch.no_grad():
    5. # 加载数据加载器,得到里面的X(图片数据)和y(真实标签)
    6. for X, y in dataloader:
    7. 加载数据
    8. pred = model(X)#进行预测
    9. # 预测值pred和真实值y的对比
    10. test_loss += loss_fn(pred, y).item()
    11. # 统计预测正确的个数
    12. correct += (pred.argmax(1) == y).type(torch.float).sum().item()#返回相应维度的最大值的索引
    13. test_loss /= size
    14. correct /= size
    15. print(f"correct = {correct}, Test Error: \n Accuracy: {(100*correct):>0.1f}%, Avg loss: {test_loss:>8f} \n")


     


    附录


    mark一下很有用的博客

    pytorch代码编写入门 - 简书

    推荐给大家!Pytorch编写代码基本步骤思想 - 知乎

    用pytorch实现神经网络_徽先生的博客-CSDN博客_pytorch 神经网络


    Dataset、DataLoader

    ① 创建一个 Dataset 对象
    ② 创建一个 DataLoader 对象
    ③ 循环这个 DataLoader 对象,将xx, xx加载到模型中进行训练

    DataLoader详解_sereasuesue的博客-CSDN博客_dataloader

    都会|可能会_深入浅出 Dataset 与 DataLoader

    Pytorch加载自己的数据集(使用DataLoader读取Dataset)_l8947943的博客-CSDN博客_pytorch dataloader读取数据

    可以直接调用的数据集

    https://www.pianshen.com/article/9695297328/


    nn.Sequential

    pytorch教程之nn.Sequential类详解——使用Sequential类来自定义顺序连接模型_LoveMIss-Y的博客-CSDN博客_sequential类

    nn.Module

    torch.nn.Module是torch.nn.functional中方法的实例化

    pytorch教程之nn.Module类详解——使用Module类来自定义模型_LoveMIss-Y的博客-CSDN博客_torch.nn.module

    对应Sequential的三种包装方式,Module有三种写法


    model.train() 和 model.eval() 

    1. model.train()
    2. for epoch in range(epoch):
    3. for train_batch in train_loader:
    4. ...
    5. zhibiao = test(epoch, test_loader, model)
    6. def test(epoch, test_loader, model):
    7. model.eval()
    8. for test_batch in test_loader:
    9. ...
    10. return zhibiao

    【Pytorch】model.train() 和 model.eval() 原理与用法_想变厉害的大白菜的博客-CSDN博客_pytorch train()

     

    pytroch:model.train()、model.eval()的使用_像风一样自由的小周的博客-CSDN博客_model.train()放在程序的哪个位置

     

    1. model = ...
    2. dataset = ...
    3. loss_fun = ...
    4. # training
    5. lr=0.001
    6. model.train()
    7. for x,y in dataset:
    8. model.zero_grad()
    9. p = model(x)
    10. l = loss_fun(p, y)
    11. l.backward()
    12. for p in model.parameters():
    13. p.data -= lr*p.grad
    14. # evaluating
    15. sum_loss = 0.0
    16. model.eval()
    17. with torch.no_grad():
    18. for x,y in dataset:
    19. p = model(x)
    20. l = loss_fun(p, y)
    21. sum_loss += l
    22. print('total loss:', sum_loss)

    https://www.jb51.net/article/211954.htm


    损失

    MAE:

    1. import torch
    2. from torch.autograd import Variable
    3. x = Variable(torch.randn(100, 100))
    4. y = Variable(torch.randn(100, 100))
    5. loos_f = torch.nn.L1Loss()
    6. loss = loos_f(x,y)

    MSE:

    1. import torch
    2. from torch.autograd import Variable
    3. x = Variable(torch.randn(100, 100))
    4. y = Variable(torch.randn(100, 100))
    5. loos_f = torch.nn.MSELoss()#定义
    6. loss = loos_f(x, y)#调用

    torch.nn中常用的损失函数及使用方法_加油上学人的博客-CSDN博客_nn损失函数


    优化器

    pytorch 优化器调参以及正确用法 - 简书


    训练&测试

    基于pytorch框架下的一个简单的train与test代码_黎明静悄悄啊的博客-CSDN博客


    图神经网络

    1. GCN、GAT

    图神经网络及其Pytorch实现_jiangchao98的博客-CSDN博客_pytorch 图神经网络

    2. 用DGL

    PyTorch实现简单的图神经网络_梦家的博客-CSDN博客_pytorch图神经网络

    一文看懂图神经网络GNN,及其在PyTorch框架下的实现(附原理+代码) - 知乎

    图神经网络的不足

    •扩展性差,因为训练时需要用到包含所有节点的邻接矩阵,是直推性的(transductive)

    •局限于浅层,图神经网络只有两层

    •不能作用于有向图

    3. 用PyG

    图神经网络框架-PyTorch Geometric(PyG)的使用__Old_Summer的博客-CSDN博客_pytorch-geometric

  • 相关阅读:
    中国本土Tier1加速崛起,这家ADAS厂商如何在多赛道领跑?
    jvm中的cms垃圾回收器和G1垃圾回收器有什么区别
    程序员写出代码版《本草纲目》毽子操,刘畊宏回复:很cool
    大白话 K8S(03):从 Pause 容器理解 Pod 的本质
    Java面试(基础篇)——解构Java常见的基础面试题 & 结合Java源码分析
    pdf误删恢复如何恢复?分享4种恢复方法!
    Spring中Bean的生命周期
    Excel中的宏、VBA
    垃圾回收器
    持续集成与持续交付
  • 原文地址:https://blog.csdn.net/sinat_38007523/article/details/127806975
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号