PyTorch实现多层感知器:基于仿真数据的分类
PyTorch实现多层感知器:基于仿真数据的分类
本教程将演示如何使用PyTorch构建一个包含多个隐层的多层感知器(MLP),并使用仿真数据进行分类任务。
1. 生成仿真数据
首先,我们使用sklearn.datasets.make_classification()函数生成用于分类的仿真数据,并将其转换为PyTorch的Tensor格式。
import torch
from torch.utils.data import TensorDataset
from sklearn.datasets import make_classification
# 生成仿真数据
X, y = make_classification(n_samples=1000, n_features=10, n_classes=5)
X = torch.from_numpy(X).float()
y = torch.from_numpy(y).long()
# 创建数据集
dataset = TensorDataset(X, y)
2. 创建DataLoader
接下来,我们使用DataLoader将数据集分成多个batch,以便于模型训练和测试。
from torch.utils.data import DataLoader
batch_size = 5
train_loader = DataLoader(dataset, batch_size=batch_size, shuffle=True)
test_loader = DataLoader(dataset, batch_size=batch_size, shuffle=False)
3. 构建多层感知器模型
接下来,我们使用nn.Module构建一个包含多个隐层的多层感知器模型。
import torch.nn as nn
input_size = 10
hidden_sizes = [20, 30]
output_size = 5
layers = []
for i in range(len(hidden_sizes)):
if i == 0:
layers.append(nn.Linear(input_size, hidden_sizes[i]))
else:
layers.append(nn.Linear(hidden_sizes[i-1], hidden_sizes[i]))
layers.append(nn.Linear(hidden_sizes[-1], output_size))
model = nn.Sequential(*layers)
print(model)
4. 定义损失函数和优化器
我们使用nn.CrossEntropyLoss作为损失函数,使用torch.optim.SGD作为优化器。
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)
5. 训练模型
最后,我们训练模型并记录训练损失、测试损失、训练分类正确率和测试分类正确率。
def train(model, train_loader, criterion, optimizer):
model.train()
train_loss = 0
correct = 0
total = 0
for inputs, targets in train_loader:
optimizer.zero_grad()
outputs = model(inputs)
loss = criterion(outputs, targets)
loss.backward()
optimizer.step()
train_loss += loss.item()
_, predicted = outputs.max(1)
total += targets.size(0)
correct += predicted.eq(targets).sum().item()
train_loss /= len(train_loader)
train_acc = 100. * correct / total
return train_loss, train_acc
def test(model, test_loader, criterion):
model.eval()
test_loss = 0
correct = 0
total = 0
with torch.no_grad():
for inputs, targets in test_loader:
outputs = model(inputs)
loss = criterion(outputs, targets)
test_loss += loss.item()
_, predicted = outputs.max(1)
total += targets.size(0)
correct += predicted.eq(targets).sum().item()
test_loss /= len(test_loader)
test_acc = 100. * correct / total
return test_loss, test_acc
train_losses = []
train_accs = []
test_losses = []
test_accs = []
for epoch in range(10):
train_loss, train_acc = train(model, train_loader, criterion, optimizer)
test_loss, test_acc = test(model, test_loader, criterion)
train_losses.append(train_loss)
train_accs.append(train_acc)
test_losses.append(test_loss)
test_accs.append(test_acc)
print('Epoch: {}, Train Loss: {:.4f}, Train Acc: {:.2f}%, Test Loss: {:.4f}, Test Acc: {:.2f}%'.format(epoch+1, train_loss, train_acc, test_loss, test_acc))
6. 可视化训练过程
可以使用matplotlib将训练过程中的指标可视化,以便更好地观察模型的训练效果。
import matplotlib.pyplot as plt
plt.plot(train_losses, label='Train Loss')
plt.plot(test_losses, label='Test Loss')
plt.legend()
plt.title('Loss')
plt.show()
plt.plot(train_accs, label='Train Accuracy')
plt.plot(test_accs, label='Test Accuracy')
plt.legend()
plt.title('Accuracy')
plt.show()
总结
本教程介绍了如何使用PyTorch构建一个多层感知器模型,并使用仿真数据进行分类任务。我们还介绍了如何使用DataLoader、nn.Module、nn.CrossEntropyLoss和torch.optim.SGD等PyTorch模块,以及如何记录和可视化训练过程中的指标。
原文地址: https://www.cveoy.top/t/topic/jrom 著作权归作者所有。请勿转载和采集!