我正试图通过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)
解码器通常对编码输入进行操作,而不是直接对输入本身进行操作,除非你使用的是我不熟悉的编码器-解码器的非标准定义。