写一个自编码器的pytorch代码
时间: 2024-05-29 18:03:51 浏览: 15
好的,以下是一个简单的PyTorch自编码器的代码示例:
```python
import torch
import torch.nn as nn
import torch.optim as optim
import numpy as np
# 定义自编码器模型类
class Autoencoder(nn.Module):
def __init__(self):
super(Autoencoder, self).__init__()
self.encoder = nn.Sequential(
nn.Linear(784, 256),
nn.ReLU(),
nn.Linear(256, 64),
nn.ReLU(),
nn.Linear(64, 16))
self.decoder = nn.Sequential(
nn.Linear(16, 64),
nn.ReLU(),
nn.Linear(64, 256),
nn.ReLU(),
nn.Linear(256, 784),
nn.Sigmoid())
def forward(self, x):
x = self.encoder(x)
x = self.decoder(x)
return x
# 加载数据
train_data = np.load('train_data.npy')
test_data = np.load('test_data.npy')
# 转换为tensor
train_data = torch.from_numpy(train_data).float()
test_data = torch.from_numpy(test_data).float()
# 定义超参数
learning_rate = 0.001
num_epochs = 20
# 定义模型、损失函数、优化器
model = Autoencoder()
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=learning_rate)
# 训练模型
for epoch in range(num_epochs):
# 前向传播
outputs = model(train_data)
loss = criterion(outputs, train_data)
# 反向传播和优化
optimizer.zero_grad()
loss.backward()
optimizer.step()
# 打印损失值
print('epoch [{}/{}], loss:{:.4f}'.format(epoch+1, num_epochs, loss.item()))
# 测试模型
with torch.no_grad():
test_outputs = model(test_data)
test_loss = criterion(test_outputs, test_data)
print('Test loss: {:.4f}'.format(test_loss.item()))
```
这个自编码器使用了一个三层的全连接神经网络,其中编码器包含了三个线性层和两个ReLU激活函数,而解码器则包含了三个线性层和一个Sigmoid激活函数。我们使用了MSE损失函数和Adam优化器,并在训练过程中打印每个epoch的损失值。最后,我们使用测试集来测试模型并打印测试损失值。