import torch
import torch.nn as nn
import torch.optim as optim
import numpy as np
import matplotlib.pyplot as plt
% matplotlib
inline
# 生成数据
num_samples = 300
num_classes = 3
feature_dim = 2
np.random.seed(1)
data = np.zeros((num_samples, feature_dim))
labels = np.zeros(num_samples, dtype=int)
for i in range(num_samples):
if i % 3 == 0:
data[i] = np.random.randn(feature_dim) * 0.1 + np.array([0, -0.5])
labels[i] = 0
elif i % 3 == 1:
data[i] = np.random.randn(feature_dim) * 0.1 + np.array([-0.5, 0.5])
labels[i] = 1
else:
data[i] = np.random.randn(feature_dim) * 0.1 + np.array([0.5, 0.5])
labels[i] = 2
# 数据可视化
plt.scatter(data[:, 0], data[:, 1], c=labels, cmap='rainbow')
plt.show()
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.fc1 = nn.Linear(2, 10)
self.fc2 = nn.Linear(10, 3)
def forward(self, x):
x = self.fc1(x)
x = nn.functional.relu(x)
x = self.fc2(x)
return x
net = Net()
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.1)
num_epochs = 50
for epoch in range(num_epochs):
running_loss = 0.0
for i in range(num_samples):
inputs = torch.tensor(data[i], dtype=torch.float32).unsqueeze(0)
labels_ = torch.tensor(labels[i], dtype=torch.long).unsqueeze(0)
optimizer.zero_grad()
outputs = net(inputs)
loss = criterion(outputs, labels_)
loss.backward()
optimizer.step()
running_loss += loss.item()
print('Epoch %3d | Loss: %.4f' % (epoch + 1, running_loss / num_samples))
print('Finished Training')
# 计算模型预测结果
predicts = np.zeros(num_samples, dtype=int)
for i in range(num_samples):
inputs = torch.tensor(data[i], dtype=torch.float32).unsqueeze(0)
outputs = net(inputs)
predicts[i] = outputs.argmax().item()
# 绘制分类结果
plt.scatter(data[:, 0], data[:, 1], c=predicts, cmap='rainbow')
plt.show()
#生成的分类结果如下图所示:
#![result](https: // img - blog.csdnimg.cn / 2021040515030366.
#png)