pytorch進行上取樣的種類例項
阿新 • • 發佈:2020-02-19
1、其中再語義分割比較常用的上取樣:
其實現方法為:
def upconv2x2(in_channels,out_channels,mode='transpose'): if mode == 'transpose': # 這個上採用需要設定其輸入通道,輸出通道.其中kernel_size、stride # 大小要跟對應下采樣設定的值一樣大小。這樣才可恢復到相同的wh。這裡時反捲積操作。 return nn.ConvTranspose2d( in_channels,kernel_size=2,stride=2) else: # out_channels is always going to be the same # as in_channels # 這裡不會改變通道數,其中scale_factor是上採用的放大因子,其是相對於當前的 # 輸入大小的倍數 return nn.Sequential( nn.Upsample(mode='bilinear',scale_factor=2,align_corners=True)) # 這裡的程式碼是在這裡設定多一個卷積,這樣子就起到了可以修改其輸出通道的功能了。 # 相當於功能跟ConvTranspose2d()差不多,只是上取樣的方法不同 conv1x1((in_channels,out_channels)) def conv1x1(in_channels,groups=1): return nn.Sequential(nn.Conv2d( in_channels,kernel_size=1,groups=groups,stride=1),nn.BatchNorm2d(out_channels))
另一種上取樣的方法是,參考程式碼:segnet_pytorch:
# Stage 5 x51 = F.relu(self.bn51(self.conv51(x4p))) x52 = F.relu(self.bn52(self.conv52(x51))) x53 = F.relu(self.bn53(self.conv53(x52))) #這個id5記錄的是池化操作時最大值的index,其要設定引數return_indices為True x5p,id5 = F.max_pool2d(x53,stride=2,return_indices=True) # Stage 5d #這個是進行最大值上取樣的函式,其是根據id5來把值放到什麼位置,其它位置沒有值的地方 補0 x5d = F.max_unpool2d(x5p,id5,stride=2) x53d = F.relu(self.bn53d(self.conv53d(x5d))) x52d = F.relu(self.bn52d(self.conv52d(x53d))) x51d = F.relu(self.bn51d(self.conv51d(x52d)))
測試例子:
#測試上取樣 m=nn.MaxPool2d((3,3),stride=(1,1),return_indices=True) upm=nn.MaxUnpool2d((3,1)) data4=torch.randn(1,1,3,3) output5,indices=m(data4) output6=upm(output5,indices) print('\ndata4:',data4,'\nmaxPool2d',output5,'\nindices:',indices,'\noutput6:',output6)
其輸出為:
data4: tensor([[[[ 2.3151,-1.0391,0.1074],[ 1.9360,0.2524,2.3735],[-0.1151,0.4684,-1.8800]]]]) maxPool2d tensor([[[[2.3735]]]]) indices: tensor([[[[5]]]]) output6: tensor([[[[0.0000,0.0000,0.0000],[0.0000,0.0000]]]])
以上這篇pytorch進行上取樣的種類例項就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。