解码器上采样大小
Decoder upsample size
我有一个简单的自动编码器,看起来像这样:
class Autoencoder(nn.Module):
def __init__(self):
super(Autoencoder, self).__init__()
self.channels = [3, 8, 16, 32]
self.encoder = nn.Sequential(
# layer 1
nn.Conv2d(self.channels[0], self.channels[1], 3, 1, 1),
nn.BatchNorm2d(self.channels[1]),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=4, stride=4),
# layer 2
nn.Conv2d(self.channels[1], self.channels[2], 3, 1, 1),
nn.BatchNorm2d(self.channels[2]),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=4, stride=4),
# layer 3
nn.Conv2d(self.channels[2], self.channels[3], 3, 1, 1),
nn.BatchNorm2d(self.channels[3]),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=2, stride=2)
)
self.decoder = nn.Sequential(
nn.Conv2d(self.channels[3], self.channels[2], 3, 1, 1),
nn.ReLU(inplace=True),
nn.Upsample(size=(15, 20), mode='bilinear', align_corners=False),
nn.Conv2d(self.channels[2], self.channels[1], 3, 1, 1),
nn.ReLU(inplace=True),
nn.Upsample(scale_factor=4, mode='bilinear', align_corners=False),
nn.Conv2d(self.channels[1], 1, 1),
nn.ReLU(inplace=True),
nn.Upsample(scale_factor=4, mode='bilinear', align_corners=False)
)
def forward(self, x):
h = self.encoder(x)
y = self.decoder(h)
return y
有人可以澄清解码器中的 nn.Upsample(size=(15, 20)...
是否与将图像恢复到原始尺寸有关吗?我的输入图像(手电筒张量)大小为 240*320,网络应该将输入张量恢复到其原始大小。
此外,如果我向具有 64 个通道的编码器添加第四层并向解码器添加第四层(类似于上面的层),那么解码的第一层中的上采样大小应该是多少?
如PyTorch Documentation中所述,您可以使用比例因子或输出大小定义上采样层。无论输入大小如何,声明 output_size=(H, W)
将确保输出大小为 (H, W)
。另一方面,声明 scale_factor=4
将确保每个空间维度的输出将是输入的 4 倍,例如(30, 40) -> (120, 160)
.
您想提及您需要获得大小为 240 * 320
的输出。因此,解码器输出的空间维度将为 (15*4*4, 20*4*4)
,方便地为 (240, 320)
.
我有一个简单的自动编码器,看起来像这样:
class Autoencoder(nn.Module):
def __init__(self):
super(Autoencoder, self).__init__()
self.channels = [3, 8, 16, 32]
self.encoder = nn.Sequential(
# layer 1
nn.Conv2d(self.channels[0], self.channels[1], 3, 1, 1),
nn.BatchNorm2d(self.channels[1]),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=4, stride=4),
# layer 2
nn.Conv2d(self.channels[1], self.channels[2], 3, 1, 1),
nn.BatchNorm2d(self.channels[2]),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=4, stride=4),
# layer 3
nn.Conv2d(self.channels[2], self.channels[3], 3, 1, 1),
nn.BatchNorm2d(self.channels[3]),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=2, stride=2)
)
self.decoder = nn.Sequential(
nn.Conv2d(self.channels[3], self.channels[2], 3, 1, 1),
nn.ReLU(inplace=True),
nn.Upsample(size=(15, 20), mode='bilinear', align_corners=False),
nn.Conv2d(self.channels[2], self.channels[1], 3, 1, 1),
nn.ReLU(inplace=True),
nn.Upsample(scale_factor=4, mode='bilinear', align_corners=False),
nn.Conv2d(self.channels[1], 1, 1),
nn.ReLU(inplace=True),
nn.Upsample(scale_factor=4, mode='bilinear', align_corners=False)
)
def forward(self, x):
h = self.encoder(x)
y = self.decoder(h)
return y
有人可以澄清解码器中的 nn.Upsample(size=(15, 20)...
是否与将图像恢复到原始尺寸有关吗?我的输入图像(手电筒张量)大小为 240*320,网络应该将输入张量恢复到其原始大小。
此外,如果我向具有 64 个通道的编码器添加第四层并向解码器添加第四层(类似于上面的层),那么解码的第一层中的上采样大小应该是多少?
如PyTorch Documentation中所述,您可以使用比例因子或输出大小定义上采样层。无论输入大小如何,声明 output_size=(H, W)
将确保输出大小为 (H, W)
。另一方面,声明 scale_factor=4
将确保每个空间维度的输出将是输入的 4 倍,例如(30, 40) -> (120, 160)
.
您想提及您需要获得大小为 240 * 320
的输出。因此,解码器输出的空间维度将为 (15*4*4, 20*4*4)
,方便地为 (240, 320)
.