自编码器pytorch
时间: 2023-11-03 09:59:21 浏览: 58
gae-pytorch-master_pytorch_pytorchgae_GAE_自编码器_gaepytorchmaster_
5星 · 资源好评率100%
自编码器是一种无监督学习算法,它的目标是学习数据的低维表示,同时尽可能地重构原始数据。在PyTorch中,可以使用`torch.nn`模块来构建自编码器。
这里给出一个简单的例子,用于学习MNIST数据集的自编码器:
```python
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader
from torchvision import datasets, transforms
# 定义自编码器
class Autoencoder(nn.Module):
def __init__(self):
super(Autoencoder, self).__init__()
self.encoder = nn.Sequential(
nn.Linear(28*28, 256),
nn.ReLU(True),
nn.Linear(256, 64),
nn.ReLU(True))
self.decoder = nn.Sequential(
nn.Linear(64, 256),
nn.ReLU(True),
nn.Linear(256, 28*28),
nn.Tanh())
def forward(self, x):
x = self.encoder(x)
x = self.decoder(x)
return x
# 加载数据集
transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.1307,), (0.3081,))
])
train_set = datasets.MNIST('data', train=True, download=True, transform=transform)
test_set = datasets.MNIST('data', train=False, download=True, transform=transform)
train_loader = DataLoader(train_set, batch_size=128, shuffle=True)
test_loader = DataLoader(test_set, batch_size=128, shuffle=True)
# 训练自编码器
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model = Autoencoder().to(device)
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
for epoch in range(10):
train_loss = 0
for batch_idx, (data, _) in enumerate(train_loader):
data = data.view(data.size(0), -1).to(device)
optimizer.zero_grad()
recon_data = model(data)
loss = criterion(recon_data, data)
loss.backward()
optimizer.step()
train_loss += loss.item()
print('Epoch: {}, Training Loss: {:.6f}'.format(epoch+1, train_loss/len(train_loader)))
# 测试自编码器
test_loss = 0
with torch.no_grad():
for data, _ in test_loader:
data = data.view(data.size(0), -1).to(device)
recon_data = model(data)
loss = criterion(recon_data, data)
test_loss += loss.item()
print('Test Loss: {:.6f}'.format(test_loss/len(test_loader)))
```
在这个例子中,我们定义了一个包含一个编码器和一个解码器的自编码器。编码器将28x28的MNIST图像压缩成一个64维的向量,解码器将这个向量重构回原始的28x28图像。我们使用均方误差作为损失函数,并使用Adam优化器进行优化。在训练过程中,我们将数据分成128个一组进行训练,每个epoch训练一次数据集。在测试过程中,我们使用测试集来计算模型的平均损失。
希望这个例子能对你理解PyTorch中的自编码器有所帮助。
阅读全文