zoukankan      html  css  js  c++  java
  • CV第八课 PyTorch

    PyTorch的三个抽象层次

    Tensor: 可以认为是 可以运行在GPU上的 numpy的array

        通过 dtype = torch.cuda.FloatTensor

          x = torch.randn(N,D_in).type(dtype) 使得在GPU上运行。

     

     Variable:  Node in a computational graph, 存储数据与梯度 data and gradient

      1.设输入  x = Variable(torch.randn(N,D_in),requires_grad=False)

         则 x.data is a Tensor ;     x.grad is a Variable of gradients;       x.grad.data is a Tensor of gradients

      2.  Variable 和 tensor 有相同的API 

      3. Variable 通过参数 requires_grad = True 就可以计算 weight matrix 的梯度

      4. 每一次计算梯度前,要将上一次梯度清空 ,而且要记得要先判断,不然会报错 None type has no  attribute data

        if w1.grad:  w1.grad.data.zero_()

    Module: torch.nn

      1. 像keras 一样的高级封装好的API,不需要打出computational graph

      2. 用一连串的层数来定义模型 model: linear RuLu linear 

        1) y的预测值  y_pred = model( x )

        2) backward前清空上次计算的梯度  model.zero_grad()

        3) 更新weight matrix : 

          for param in model.parameters():

            param.data -= learning_rate * para.grad.data

      3.  nn 自带loss_function   

        loss_fn = torch.nn.MESLoss(size_average=False)     

        for t in range(500):

          loss = loss_fn(y_pred,y)

     

    优化方法的运用  :

    optimizer = torch.optim.Adam(model.parameters(), lr = learning_rate)

    for t in range(500):

      y_pred = model(x)

      loss = loss_fn(y_pred,y)

      

      optimizer.zero_grad()

      loss.backward()

      optimizer.step()        # 在计算了所有梯度之后,更新所有的参数 weight matrix

    定义自己的Module:

      之后就可以用module

        Class TwoLayerNet(torch.nn.Module):

          def __init__(self,D_in,H,D_out):

            super(TwoLayerNet,self).__init__()

            self.linear1 = torch.nn.Linear(D_in,H)

            self.linear2 = torch.nn.Linear(H,D_out)

          def forward(self,x):

            h = self.linear1(x)

            h_relu = h.clamp(0)

            y_pred = self.linear2(h_relu)

            return y_pred

        model = TwoLayerNet(D_in,H,D_out)

      替换 

        model = model.nn.Sequential (

          torch.nn.Linear(D_in,H),

          torch.nn.ReLu(),

          torch.nn.Linear(H,D_out)

        )

    注:  super() 函数是用于调用父类(超类)的一个方法。   https://www.runoob.com/python/python-func-super.html

    有了输入之后的网络:

    loader = DataLoader(TensorDataset(x,y),batch_size = 8)       # 一次读取8个样本

    for epoch in range(10):

      for x_batch,y_batch in loader:

         x_var,y_var = Variable(x),Variable(y)                                                   # 其实这里我很疑惑,参数是不是Variable(x_batch )

         y_pred = model(x_var)

        loss = loss_fn(y_pred,y_var)

        

        optimizer.zero_grad()                                     # 清空梯度

        loss_backward()

        

        optimizer.step()                                        # 更新 weight matrix

        

    预训练 

    可视化 : Visdom  与tensorflow 的 tensorboard相似

    静态图 tensorflow  VS   动态图 pytorch

  • 相关阅读:
    IdHTTP + RegExpr
    Delphi多线程编程之五不同类线程读写全局变量阻塞和锁定
    服务器开发
    Delphi多线程编程之四 线程安全和VCL
    接口测试方式
    LR11开始录制时打不开浏览器
    接口测试基础
    ospf应用简单
    OSPF协议原理及配置4邻接关系的建立和LSDB同步
    windows7安装远程服务器AD域管理工具
  • 原文地址:https://www.cnblogs.com/ChevisZhang/p/12969547.html
Copyright © 2011-2022 走看看