pytorch中文文檔學習

pytorch中文文檔學習0

1.自動求導

每一個變量都有兩個標誌:requires_grad和volatile.python

  • requires_grad: 只有全部輸入都不須要梯度時,輸出纔不須要;若是有一個輸入有梯度,它的輸出也有梯度。函數

    >>> x = Variable(torch.randn(5, 5))
    >>> y = Variable(torch.randn(5, 5))
    >>> z = Variable(torch.randn(5, 5), requires_grad=True)
    >>> a = x + y
    >>> a.requires_grad
    False
    >>> b = a + z
    >>> b.requires_grad
    True
    
    
    # 若是想凍結部分模型時,只要切換凍結模型中的requires_grad標誌就能夠了
    model = torchvision.models.resnet18(pretrained=True)
    for param in model.parameters():
        param.requires_grad = False
    # Replace the last fully-connected layer
    # Parameters of newly constructed modules have requires_grad=True by default
    model.fc = nn.Linear(512, 100)
    
    # Optimize only the classifier
    optimizer = optim.SGD(model.fc.parameters(), lr=1e-2, momentum=0.9)
  • volatile學習

    純粹的inference模式下推薦使用volatile,當你肯定你甚至不用調用.backward()時,它比任何其餘自動求導的設置更有效。--它將使用絕對最小的內存來評估模型。volatile也決定了require_grad is False。volatile不一樣於require_grad的傳遞。若是一個操做甚至只有一個volatile的輸入,它的輸出也將會是volatile.ui

    >>> regular_input = Variable(torch.randn(5, 5))
    >>> volatile_input = Variable(torch.randn(5, 5), volatile=True)
    >>> model = torchvision.models.resnet18(pretrained=True)
    >>> model(regular_input).requires_grad
    True
    >>> model(volatile_input).requires_grad
    False
    >>> model(volatile_input).volatile
    True
    >>> model(volatile_input).creator is None
    True

2.擴展torch

  • 擴展torch.autograd編碼

    若是想添加一個新的operation到autograd的話,你的operation須要繼承class Function。autograd使用Function計算結果和梯度,同時編碼operation的歷史。每一個新的operation(function)都須要實現三個方法:code

    • __ init __(optional)
    • forward()
    • backward()
  • 擴展torch.nn繼承

    nn包含兩種接口-modules和他們的functional版本。經過這兩個接口,你均可以擴展nn。可是記憶擴展layer的時候,使用modules,由於modules保存着參數和buffer。若是不須要參數的話,那麼建議使用functional(激活函數,pooling,這些都不須要參數。)接口

相關文章
相關標籤/搜索