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

  • 相关阅读:
    win7网络共享原来如此简单,WiFi共享精灵开启半天都弱爆了!
    JQUERY UI Datepicker Demo
    Official online document, install svn server in centOS
    JAVE not work in linux
    AMR 转mp3 失败
    XD, XR, DR 股票
    Linux 下MySql 重置密码
    Difinition Of Done
    Apache, Tomcat, JK Configuration Example
    Linux 安装tomcat
  • 原文地址:https://www.cnblogs.com/ChevisZhang/p/12969547.html
Copyright © 2011-2022 走看看