我已经在 pytorch 中定义了我的自动编码器如下(它在编码器的输出处给了我一个 8 维瓶颈,它可以正常工作 torch.Size([1, 8, 1, 1])):
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
解码器给我一个错误,即解码器无法对张量进行上采样:
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)
在上采样后打印您的确切形状。
你可以:
4
在第一Conv2d
解码器使用3
或者2
甚至1
torch.nn.ConvTranspose2d(8, 64, kernel_size=7, stride=2)
会给你7x7
4x4
或可能是5x5
. 如果您将图像压缩得如此之多,则无法将足够的信息编码到一个像素中,即使代码通过,网络也不会学习任何有用的表示。本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句