pytorch安装以及前置知识

pytorch 安装

pytorch 为什么好呢,我个人感觉可能是它比较清晰的model,dataset,以及一套平白的训练流程,还有他的比较丰富论坛,扩展库例如说pytorch Lighting这样的库比较有意思(有点类似于简化训练流程,就像tensorflow的keras)。

安装

个人比较喜欢用专业版的pycahrm(IDE颜粉),anaconda过于臃肿了(miniconda还不错)

##安装python后下载pytorch
pip install torch

pytorch 一些前置知识(个人认为要注意的点)

  • 共享内存

    import torch
    x = torch.rand(4,3)
    # 取第二列
    print(x[:, 1]) 
    
    y = x[0,:]
    y += 1
    print(y)
    print(x[0, :]) # 源tensor也被改了了
    

    结果会像下面这样

    tensor([-0.0720,  0.0666,  1.0336, -0.6965])
    
    tensor([3.7311, 0.9280, 1.2497])
    tensor([3.7311, 0.9280, 1.2497])
    

    再就是torch.view 方法改变张量的的形状,但是依旧共享内存

    torch.reshape则不会出现这种情况

  • Autograd

    torch.tensor 非常强大,每个tensor都有.grad_fn属性,记录了完整的计算历史

    当你计算定义x时 就像这样

    x = torch.randn(3,3,requires_grad=True)##默认requires_grad属性为False
    
    y = x**2
    
    z = y*y*5
    
    out = z.mean()
    ##此后经过计算的任意一个变量都将携带.grad_fn 属性
    

    计算梯度

    out.backward()##求导过程
    x.grad##计算梯度
    

    梯度就是雅可比矩阵,再就是涉及到链式法则

    注意:grad是累加的,所以当我们更新参数时需要计算一次梯度就将梯度清0,在反向传播之前

    x.grad.data.zero_()
    out.backward()
    x.grad
    

    example:

    out2 = x.sum()
    out2.backward()
    print(x.grad)
    
    out3 = x.sum()
    x.grad.data.zero_()
    out3.backward()
    print(x.grad)
    
    ##ouput
    tensor([[ 5.7165, -0.0604,  1.0144],
            [-1.1827, -9.2717,  0.9914],
            [ 1.0796,  1.0057,  0.9915]])
    tensor([[1., 1., 1.],
            [1., 1., 1.],
            [1., 1., 1.]])
    

    如果想要只有单单x的值,而将此算进grad图这样

    x.data
    

    就OK了

    计算时,不想要梯度参与(valid时)

    with torch.no_grad():
        print((x ** 2).requires_grad)
    

    计算时,不想要梯度参与(valid时)

    with torch.no_grad():
        print((x ** 2).requires_grad)
    

你可能感兴趣的:(pytorch,python,深度学习)