PyTorch AutoEncoder:mat1和mat2形状不能相乘(1x512和12x64)



我正试图通过AutoEncoder传递CNN的输出特性。我使用了一个钩子层来提取CNN的特征,并将它们转换为张量。

extracted_features = torch.tensor(rn_output)

从元组转换为张量后的数据大小为torch.Size([1014,512])

AutoEncoder的解码器部分正在抛出"无法相乘错误",但我认为该错误是由于输入的设置和形状造成的。

自动编码器

class AutoEncoder(nn.Module):
def __init__(self):
super(AutoEncoder, self).__init__()
self.encoder = nn.Sequential(
nn.Linear(in_features=512, out_features=256),  # N, 512 -> N,128 
nn.ReLU(),  # Activation Function
nn.Linear(in_features=256, out_features=128),
nn.ReLU(),
nn.Linear(in_features=128, out_features=64),
nn.ReLU(),  # Activation Function
nn.Linear(in_features=64, out_features=12),
)
self.decoder = nn.Sequential(
nn.Linear(in_features=12, out_features=64),  # N, 3 -> N,12 
nn.ReLU(),  # Activation Function
nn.Linear(in_features=64, out_features=128),
nn.Linear(in_features=128, out_features=256),
nn.ReLU(),  # Activation Function
nn.Linear(in_features=256, out_features=512),
nn.Tanh()
)

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

调用自动编码器


model = AutoEncoder()
criterion = nn.MSELoss()
optimiser = torch.optim.Adam(model.parameters(), lr=1e-3, weight_decay=1e-5)
num_epochs = 10
outputs = []
for epoch in range(num_epochs): 
for (img) in extracted_features:
recon = model(img)
loss = criterion(recon, img)

optimiser.zero_grad()
loss.backward()
optimiser.step()

print(f'Epoch:{epoch+1}, Loss:{loss.item():.4f}')
outputs.append((epoch, img, recon))

我尝试过使用数据加载器,并以较小的批量大小传递数据。我也尝试过在正向方法中重塑图像,但我仍然会得到相同的错误

我很确定您的forward函数执行编码器-解码器步骤不正确。我认为你应该改变它从这个:

encoded = self.encoder(x)
decoded = self.decoder(x)

到此:

encoded = self.encoder(x)
decoded = self.decoder(encoded)

解码器通常对编码输入进行操作,而不是直接对输入本身进行操作,除非你使用的是我不熟悉的编码器-解码器的非标准定义。

相关内容

  • 没有找到相关文章

最新更新