2017-06-07 75 views
0

我是PyTorch的新手,在使用其他工具包一段時間後嘗試使用它。pytorch自定義圖層「不是模塊子類」

我想了解如何編程自定義圖層和功能。而作爲一個簡單的測試,我寫了這個:

class Testme(nn.Module):   ## it _is_ a sublcass of module ## 
    def __init__(self): 
     super(Testme, self).__init__() 

    def forward(self, x): 
     return x/t_.max(x) 

其目的是使通過它的數據總和爲1.沒有實際的用處,只是在測試。

然後我把它插入到從PyTorch遊樂場示例代碼:

def make_layers(cfg, batch_norm=False): 
    layers = [] 
    in_channels = 3 
    for i, v in enumerate(cfg): 
     if v == 'M': 
      layers += [nn.MaxPool2d(kernel_size=2, stride=2)] 
     else: 
      padding = v[1] if isinstance(v, tuple) else 1 
      out_channels = v[0] if isinstance(v, tuple) else v 
      conv2d = nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=padding) 
      if batch_norm: 
       layers += [conv2d, nn.BatchNorm2d(out_channels, affine=False), nn.ReLU()] 
      else: 
       layers += [conv2d, nn.ReLU()] 
      layers += [Testme]       # here <------------------ 
      in_channels = out_channels 
    return nn.Sequential(*layers) 

結果是錯誤的!

TypeError: model.Testme is not a Module subclass 

也許這需要是一個功能,而不是一個模塊?也不清楚Function,Module之間的區別。

例如,爲什麼函數需要backward(),即使它完全由標準pytorch原語構造,而模塊不需要它?

回答

0

這是一個簡單的。你幾乎已經知道了,但是你忘了實際創建新的Testme類的一個實例。即使創建特定類的實例沒有使用任何參數(如Testme),也需要這樣做。但是它比卷積層更容易被忘記,你通常會傳遞很多爭論。

將您指定的行更改爲以下內容並解決問題。

layers += [Testme()]