Skip to content

PyTorch文档阅读笔记

DingfengShi edited this page Mar 1, 2018 · 6 revisions

PyTorch文档阅读笔记

一些细节点

  • 使用Variable包装Tensor,Variable其实只是一个装Tensor的容器,可用于自动求导

    x = torch.randn(3)
    x = Variable(x, requires_grad=True)
    
    y = x * 2
    y.backward(...) #省略号里面shape要和y相同
    #此时
    x.grad  #可以得到梯度值
  • 使用torch.nn包来加速模型建立

    #例子
    #nn里分为两种类型Module(直接在nn里),functional。两者的差别就是该层需不需要参数  
    #比如卷积层,声明需要定义一些参数:nn.Conv2d(1, 6, 5)(inputTensor)需要声明类后要通过__call__方式调用  
    #而functional对于无参数的网络结构则更方便,比如  
    x = nn.functional.relu(inputTensor)
    #一般functional也有Module的实现,比如  
    x = nn.Relu()(inputTersor)

    注意:torch.nn的输入一定是要带batch维度的,所以就算只有一条数据,也要在最前面补上一个值为1的维度:data.unsqueeze(0)

  • 使用GPU
    如果单独对某些Variable或者Tensor存入GPU中,只需对其执行cuda()方法即可。(Variable和Tensor都右cuda()方法,先把Tensor放入GPU再用Variable包装,和先把Tensor放入Variable都能得到同样的结果)

    ten = torch.FloatTensor(2)
    ten_cuda = ten1.cuda()
    V = autograd.Variable(ten_cuda)
    #和下面能得到同样结果
    ten = torch.FloatTensor(2)
    V = autograd.Variable(ten)
    V = V.cuda()
  • 继承torch.nn.Module来定义模型 通过继承该类并重写forward方法即可,不需要写反向传播

    class Net(nn.Module):
    ...
       def forward(self,input):
       ...
    ...
    net=Net()
    #使用GPU,直接对Module调用cuda()方法即可使里面原定义好的参数放入GPU,(但调用后,对类内方法新创建的参数并不会自动放入GPU)
    net=net.cuda()
    
    #模型变成GPU以后,输入数据也要调用cuda方法
    out = net.forward(data.cuda())
    
    #一开始要对模型参数的梯度缓存归零
    net.zero_grad() 
    out.backward(...)
Clone this wiki locally