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

 

 

posted @ 2020-05-26 23:30  ChevisZhang  阅读(248)  评论(0编辑  收藏  举报