在pytorch中对自动编码器进行升采样

时间:2019-09-23 20:02:32

标签: python neural-network conv-neural-network pytorch

我在pytorch中定义了我的自动编码器,如下所示(它在编码器的输出端给了我一个8维的瓶颈,可以很好地运行torch.Size([1、8、1、1])):

//Error, no body for the method
public ActionResult Random();

//Resolve error
public ActionResult Random()
{
    return someActionResult;
}

我不能做的是用

训练自动编码器
self.encoder = nn.Sequential(
    nn.Conv2d(input_shape[0], 32, kernel_size=8, stride=4),
    nn.ReLU(),
    nn.Conv2d(32, 64, kernel_size=4, stride=2),
    nn.ReLU(),
    nn.Conv2d(64, 8, kernel_size=3, stride=1),
    nn.ReLU(),
    nn.MaxPool2d(7, stride=1)
)

self.decoder = nn.Sequential(
    nn.ConvTranspose2d(8, 64, kernel_size=3, stride=1),
    nn.ReLU(),
    nn.Conv2d(64, 32, kernel_size=4, stride=2),
    nn.ReLU(),
    nn.Conv2d(32, input_shape[0], kernel_size=8, stride=4),
    nn.ReLU(),
    nn.Sigmoid()
)

解码器给我一个错误,表明解码器无法对张量进行升采样:

def forward(self, x):
    x = self.encoder(x)
    x = self.decoder(x)
    return x

2 个答案:

答案 0 :(得分:3)

您无法通过ConvTranspose2d进行足够的上采样,编码器的形状仅为1像素(width x height),请参见以下示例:

import torch

layer = torch.nn.ConvTranspose2d(8, 64, kernel_size=3, stride=1)
print(layer(torch.randn(64, 8, 1, 1)).shape)

这将在上采样后打印出准确的(3,3)形状。

您可以:

  • 使内核更小-而不是在解码器的前4中使用Conv2d3甚至是2的{​​{1}}
  • 更多地上采样,例如:1会给您torch.nn.ConvTranspose2d(8, 64, kernel_size=7, stride=2)
  • 我个人将做的事情:减少编码器中的下采样,因此输出形状至少为7x74x4。如果将图像压缩得太多,就无法将足够的信息编码为一个像素,即使代码通过网络,也不会学到任何有用的表示。

答案 1 :(得分:2)

我设法实现了一个自动编码器,该编码器提供了无监督的群集(在我的情况下为8类)

这不是专家的解决方案。我要感谢@Szymon Maszke的建议。

self.encoder = nn.Sequential(
    nn.Conv2d(1, 32, kernel_size=8, stride=4),
    nn.ReLU(),
    nn.Conv2d(32, 64, kernel_size=4, stride=2),
    nn.ReLU(),
    nn.Conv2d(64, 2, kernel_size=3, stride=1),
    nn.ReLU(),
    nn.MaxPool2d(6, stride=1)
)

self.decoder = nn.Sequential(
    nn.ConvTranspose2d(2, 64, kernel_size=3, stride=1),
    nn.ReLU(),
    nn.ConvTranspose2d(64, 32, kernel_size=8, stride=4),
    nn.ReLU(),
    nn.ConvTranspose2d(32, 1, kernel_size=8, stride=4)
)