堆叠自编码器的一个简单例子
本文使用PyTorch实现堆叠自编码器的案例,该模型使用生成的随机数作为原始数据集。
首先,我们需要导入必要的PyTorch库和随机数生成库:
import torch
import torch.nn as nn
import torch.optim as optim
import numpy as np
接下来,我们将生成随机数并将其转换为PyTorch张量:
data = np.random.rand(1000, 10) # 生成1000个10维的随机数
data = torch.Tensor(data) # 将数据转换为PyTorch张量
现在我们可以定义我们的堆叠自编码器模型。这里我们将使用两个编码器和两个解码器。第一个编码器和解码器将输入的10维数据编码为4维潜在表示,第二个编码器和解码器将这个4维表示进一步编码为2维表示。最后,第二个解码器将2维表示解码为10维表示。
class StackedAutoencoder(nn.Module):
def __init__(self):
super(StackedAutoencoder, self).__init__()
self.encoder1 = nn.Sequential(
nn.Linear(10, 4),
nn.ReLU()
)
self.encoder2 = nn.Sequential(
nn.Linear(4, 2),
nn.ReLU()
)
self.decoder1 = nn.Sequential(
nn.Linear(2, 4),
nn.ReLU()
)
self.decoder2 = nn.Sequential(
nn.Linear(4, 10),
nn.ReLU()
)
def forward(self, x):
x = self.encoder1(x)
x = self.encoder2(x)
x = self.decoder1(x)
x = self.decoder2(x)
return x
现在,我们可以创建一个堆叠自编码器实例,并定义损失函数和优化器:
model = StackedAutoencoder()
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
最后,我们可以开始训练我们的模型。我们将训练100个epoch,并在每个epoch结束时输出损失:
for epoch in range(100):
output = model(data)
loss = criterion(output, data)
optimizer.zero_grad()
loss.backward()
optimizer.step()
print("Epoch [{}/{}], Loss: {:.4f}".format(epoch+1, 100, loss.item()))
这段代码将遍历100个epoch,并在每个epoch中计算模型输出和损失。然后,我们将使用反向传播来更新模型参数。最后,我们将输出当前epoch的损失。
接下来我们可以使用训练好的模型来进行数据重建。我们可以将原始数据输入到训练好的模型中,并获取重建的数据:
reconstructed_data = model(data)
我们也可以将重建数据与原始数据进行比较,以评估模型的性能。以下是一些代码,用于计算平均重建误差:
mse_loss = nn.MSELoss()
reconstruction_error = mse_loss(data, reconstructed_data).item()
print("Average Reconstruction Error: {:.4f}".format(reconstruction_error))
最后,我们可以使用可视化工具如matplotlib将原始数据和重建数据进行可视化比较:
import matplotlib.pyplot as plt
fig, ax = plt.subplots(2, 10, figsize=(20, 4))
for i in range(10):
ax[0][i].imshow(data[i].reshape(1, 10), cmap='gray')
ax[0][i].axis('off')
ax[1][i].imshow(reconstructed_data[i].detach().numpy().reshape(1, 10), cmap='gray')
ax[1][i].axis('off')
plt.show()
这段代码将生成一张包含两行10列的图像,其中第一行是原始数据,第二行是重建数据。您可以使用这个可视化来查看模型如何重建数据,并评估模型的性能。