我们使用sklearn提供的iris数据作为训练数据。此处只是为了演示多元分类的基本操作,神经网络的结构在参数上可能存在一定的问题,期望批评指正。
from sklearn.datasets import load_iris
import torch
from torch import nn, optim
import numpy as np
import matplotlib.pyplot as plt
class MyNetwork(nn.Module):
def __init__(self):
super().__init__()
self.Model = nn.Sequential(
nn.Linear(4, 16),
nn.Linear(16, 4),
nn.Linear(4,3),
nn.Softmax(dim=1)
)
def forward(self, x):
return self.Model(x)
myNetwork = MyNetwork().cuda()
lossFunction = nn.CrossEntropyLoss()
optimizer = optim.Adam(myNetwork.parameters(), lr=0.1)
def train(echo=100):
for i in range(100):
y = myNetwork(inputX)
loss = lossFunction(y, targetY.squeeze())
optimizer.zero_grad()
loss.backward()
optimizer.step()
lossRecord[1][i] = loss
if __name__ == "__main__":
iris = load_iris()
inputX = torch.tensor(iris.data).float().cuda()
targetY = torch.tensor(iris.target).long().view(150,1).cuda()
echo = 100
lossRecord = np.vstack((
np.arange(0, echo),
np.zeros(echo)
))
上式中的lossRecord记录损失函数的下降过程。
train(echo)
print(torch.max(myNetwork(inputX).cpu(), 1)[1].detach().numpy() - iris.target)
输出的是拟合情况与原目标函数的差异。