在编写AutoEncoder模型时,需要注意卷积层的参数设置。如果卷积层的输出形状与后续层所输入的形状不一致,就会出现上述错误。
例如,在以下代码中,如果输入数据的形状为(64, 1000)(每个样本有1000个特征),经过卷积层后的输出形状将变为(64, 496)(假设使用卷积核大小为5,步长为1)。此时如果直接将输出输入到全连接层中,就会出现维度不一致的错误。
import torch.nn as nn
class AutoEncoder(nn.Module):
def __init__(self):
super(AutoEncoder, self).__init__()
self.encoder = nn.Sequential(
nn.Conv1d(in_channels=1000, out_channels=16, kernel_size=5, stride=1, padding=2),
nn.ReLU(True),
nn.Conv1d(in_channels=16, out_channels=8, kernel_size=5, stride=1, padding=2),
nn.ReLU(True))
self.decoder = nn.Sequential(
nn.ConvTranspose1d(in_channels=8, out_channels=16, kernel_size=5, stride=1, padding=2),
nn.ReLU(True),
nn.ConvTranspose1d(in_channels=16, out_channels=1000, kernel_size=5, stride=1, padding=2),
nn.ReLU(True))
def forward(self, x):
x = self.encoder(x)
x = self.decoder(x)
return x
为了避免这种错误,可以通过添加Flatten层将卷积层的输出形状转换为一维向量,并将其输入到全连接层中。修改后的代码如下:
import torch.nn as nn
class AutoEncoder(nn.Module):
def __init__(self):
super(AutoEncoder, self).__