zoukankan      html  css  js  c++  java
  • 时隔好几天,我又回来了

    其实昨天晚上就想写博客的,但是有个东西一直没搞明白,弄到了十点才从实验室走,希望今天能把他搞明白。现在是2020/9/28 10:12,刚刚装好Redmi的显示器,真香。等等还要去上课的我(除了早上一二节没课,剩下的满课,呜呜呜),先随便写写了。(还有昨天LGD打得真菜,虽然我是一个打LOL不超过十局的人,但是我看了挺多比赛哈哈。

    学了啥

    首先就是eat pytorch in 20 days的进度了

    上一篇博客是day4,也就是1-4,截至昨天学到了day9,也就是3-2,但是中间还是有一些东西我还不是很理解的,等等会做个梳理。今天努力把day10的学完。不行了,先去上课了。


    现在是16:54下课刚刚回来,到实验室,把这个写完再开始学习

    问题1:backward()的反向传播机制

    先上代码:
    下面是标量反向传播

    import numpy as np 
    import torch 
    
    # f(x) = a*x**2 + b*x + c的导数
    
    x = torch.tensor(0.0,requires_grad = True) # x需要被求导
    a = torch.tensor(1.0)
    b = torch.tensor(-2.0)
    c = torch.tensor(1.0)
    y = a*torch.pow(x,2) + b*x + c 
    
    y.backward()
    # 这里没有传参数
    
    dy_dx = x.grad
    print(dy_dx)
    
    

    接着的是非标量的反向传播

    import numpy as np 
    import torch 
    
    # f(x) = a*x**2 + b*x + c
    
    x = torch.tensor([[0.0,0.0],[1.0,2.0]],requires_grad = True) # x需要被求导
    a = torch.tensor(1.0)
    b = torch.tensor(-2.0)
    c = torch.tensor(1.0)
    y = a*torch.pow(x,2) + b*x + c 
    
    gradient = torch.tensor([[1.0,1.0],[1.0,1.0]])
    
    print("x:
    ",x)
    print("y:
    ",y)
    y.backward(gradient = gradient)
    # 为什么这里需要传gradient参数
    
    x_grad = x.grad
    print("x_grad:
    ",x_grad)
    

    两个代码的对比,我不明白非标量为什么需要y.backward()中需要传gradient这个参数,并且不清楚这个参数的作用。最后在某篇博文找到了答案

    链式求导法则,本质上是求解y的各分量对自变量的导数,然后乘上y对自己分量的梯度。其实这里的1.0可以理解成y对y求导,其结果是1.0。如果把这个tensor改成0.2或者2.3等等的数字,那相当于是这样子的效果。

    •  **A = 0.2y[0] + 2.3y[1]** 
      

    顺便留两张向量,矩阵求导的公式


    问题2:torch.autograd.Function的理解

    说是Function的理解,其实是Function的新旧版本实例化方式。

    a = F.apply(args)
    
    f = F()
    a = f(args)
    

    的区别
    第一块代码是新版本的实例化方式,第二块代码是旧版的。我犯的错误是用旧版本的去实例化新版本的class,就发生了报错。因为新旧版本的class写法是不一样的。具体看这个链接

    问题3:是关于python的,先上代码

    print(X)
    print(torch.squeeze(model.forward(X)>=0.5))
    print(torch.squeeze(model.forward(X)<0.5))
    temp1 = X[torch.squeeze(model.forward(X)>=0.5)]
    temp2 = X[torch.squeeze(model.forward(X)<0.5)]
    print(temp1)
    print(temp2)
    print(X.shape)
    print(temp1.shape)
    print(temp2.shape)
    

    下面是代码的结果

    一直弄不明白X的下标取True or False的时候,会得到什么,最后只要打印出来,看结果是mask,但是我也不是很确定,但目前还没找到答案。

    结束啦

    今天就到这里吧,虽然说买了显示器,但是我的电脑是超极本,转接口还没到,还是智能看着这个13寸的小屏幕写博客,呜呜呜。其实它中午的时候到菜鸟驿站了,但是因为上课没法去拿,等等去拿一下,然后给大家上个照片hhh

  • 相关阅读:
    「训练反思18」 (8.16) 认清自己
    「训练日志17」 (8.12) 崩盘
    「训练日志16」 8.11 下坠
    「训练日志15」 (8.10)
    「训练反思15」(8.10)
    「训练日志14 」(8.9) 失败
    训练日志13 (8.7)
    Linux 设置vim指令
    训练日志12 (8.5)
    训练反思12 (8.5)
  • 原文地址:https://www.cnblogs.com/nanjibin/p/13746074.html
Copyright © 2011-2022 走看看