我有一個由編碼器和解碼器組成的 3D 卷積網路。在解碼器部分,我想使用解碼器部分中使用的卷積層型別,但要讓它們進行反卷積。換句話說,我希望提到的卷積層增加空間大小,就像編碼器中使用的逆速率一樣,同時減少通道數。我在編碼器中使用的卷積層包含順序層:
Conv_layer = nn.Sequential(
BasicConv3d(64, 64, kernel_size=1, stride=1),
SepConv3d(64, 192, kernel_size=3, stride=1, padding=1),
nn.MaxPool3d(kernel_size=(1,3,3), stride=(1,2,2), padding=(0,1,1)),
)
使用的卷積層型別:
class BasicConv3d(nn.Module):
def __init__(self, in_planes, out_planes, kernel_size, stride, padding=0):
super(BasicConv3d, self).__init__()
self.conv = nn.Conv3d(in_planes, out_planes, kernel_size=kernel_size, stride=stride, padding=padding, bias=False)
self.bn = nn.BatchNorm3d(out_planes, eps=1e-3, momentum=0.001, affine=True)
self.relu = nn.ReLU()
def forward(self, x):
x = self.conv(x)
x = self.bn(x)
x = self.relu(x)
return x
class SepConv3d(nn.Module):
def __init__(self, in_planes, out_planes, kernel_size, stride, padding=0):
super(SepConv3d, self).__init__()
self.conv_s = nn.Conv3d(in_planes, out_planes, kernel_size=(1,kernel_size,kernel_size), stride=(1,stride,stride), padding=(0,padding,padding), bias=False)
self.bn_s = nn.BatchNorm3d(out_planes, eps=1e-3, momentum=0.001, affine=True)
self.relu_s = nn.ReLU()
self.conv_t = nn.Conv3d(out_planes, out_planes, kernel_size=(kernel_size,1,1), stride=(stride,1,1), padding=(padding,0,0), bias=False)
self.bn_t = nn.BatchNorm3d(out_planes, eps=1e-3, momentum=0.001, affine=True)
self.relu_t = nn.ReLU()
def forward(self, x):
x = self.conv_s(x)
x = self.bn_s(x)
x = self.relu_s(x)
x = self.conv_t(x)
x = self.bn_t(x)
x = self.relu_t(x)
return x
我的問題是我應該如何改變kernel_size,stride并將padding上述層更改為反卷積,以增加特征圖的空間大小與卷積層的反速率相同。
uj5u.com熱心網友回復:
基本上,你想要一個nn.ConvTranspose3d內核大小(3, 3, 3)和步幅(1, 2, 2)。您可以在此處查看將輸入大小與輸出大小相關的公式:
D_out=(D_in?1)×stride ? 2×padding dilation×(kernel_size?1) output_padding 1
在您的情況下,kernel_size=3時間維度為 1 dilation=1,stride空間維度為 2。
因此,所需的層將類似于:
out_planes = 192
in_planes = 64
deconv_layer = nn.Sequential(
nn.ConvTranspose3d(out_planes, out_planes, kernel_size=(3, 1, 1), stride=1, padding=0, output_padding=0)
nn.BatchNorm3d(out_planes),
nn.ReLU(inplace=True),
nn.ConvTranspose3d(out_planes, in_planes, kernel_size=(1, 3, 3), stride=(1, 2, 2), padding=(0, 1, 1), output_padding=(0, 1, 1))
nn.BatchNorm3d(in_planes),
nn.ReLU(inplace=True),
BasicConv3d(in_planes, in_planes, kernel_size=1, stride=1), # to be consistent with the Conv_layers structure
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/511626.html
標籤:图像处理火炬卷积神经网络
上一篇:為什么我在openCV中得到完全不同的藍色標記的色調值?
下一篇:從圖表中提取繪圖線
