Python pytorch中自动编码器的上采样

Python pytorch中自动编码器的上采样,python,neural-network,conv-neural-network,pytorch,Python,Neural Network,Conv Neural Network,Pytorch,我在Pytork中定义了我的自动编码器,如下所示(它在编码器的输出端给了我一个8维的瓶颈,可以很好地工作torch.Size([1,8,1,1]): 我不能做的是用 def forward(self, x): x = self.encoder(x) x = self.decoder(x) return x 解码器给我一个错误,解码器无法对张量进行上采样: Calculated padded input size per channel: (3 x 3). Kernel

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

我不能做的是用

def forward(self, x):
    x = self.encoder(x)
    x = self.decoder(x)
    return x
解码器给我一个错误,解码器无法对张量进行上采样:

Calculated padded input size per channel: (3 x 3). Kernel size: (4 x 4). Kernel size can't be greater than actual input size

通过
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)
形状

你可以:

  • 使用
    3
    2
    甚至
    1
  • 例如,向上采样更多:
    torch.nn.ConvTranspose2d(8,64,内核大小=7,步长=2)
    将为您提供
    7x7
  • 我个人会做的是:在编码器中减少采样,所以在它之后输出形状至少是
    4x4
    或者可能是
    5x5
    。如果你把图像挤压得太厉害,就没有办法将足够的信息编码成一个像素,即使代码通过网络也学不到任何有用的表示法

我已经成功实现了一个自动编码器,它提供了一个无监督的集群(在我的例子中是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)
)

谢谢你的回答。主要的限制是,我希望有一个8维的图像表示,因此减少到1像素(我将有8倍的像素,我可以在以后用作分类器)。我想有8类分类的图像。顺便说一句,我不是靠这个赚钱的。这是出于我自己的好奇心。谢谢。我在想也许2x2x2可以上我的8节课?在你看来这会更好吗?我不确定你诚实的目标是什么。Autoencoder的目标是将表示压缩为最基本的部分,并尽可能无损地解压缩。你的输入形状是什么?为什么要使用自动编码器进行分类?正常的方法对你的帮助会更大吗?我的输入形状是批次,1,84,84,来自openai健身房的atari游戏。我想使用autoencoder将帧分为8个不同的类。非常感谢您的建议。我会试试的。我尝试的是:
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)
)