我在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
答案 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
中使用Conv2d
或3
甚至是2
的{{1}} 1
会给您torch.nn.ConvTranspose2d(8, 64, kernel_size=7, stride=2)
7x7
或4x4
。如果将图像压缩得太多,就无法将足够的信息编码为一个像素,即使代码通过网络,也不会学到任何有用的表示。答案 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)
)