用鸢尾花数据集进行基于神经网络的分类要求用torch包和sklearn包: 要求步骤: 1 数据用鸢尾花数据集(所有样本的四个特征,三个类别) 2 输出标签(one hot vector) 3 构建模型时输出端映射到0.1之间 4 修改损失函数为交叉熵函数
时间: 2024-02-01 12:14:16 浏览: 80
好的,以下是基于神经网络的分类代码实现:
使用 torch 和 sklearn 包:
```python
import torch
import torch.nn as nn
import torch.optim as optim
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import OneHotEncoder
# 加载鸢尾花数据集
iris = load_iris()
X, y = iris.data, iris.target
# 将标签进行 one-hot 编码
enc = OneHotEncoder()
y = enc.fit_transform(y.reshape(-1, 1)).toarray()
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 定义神经网络模型
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.fc1 = nn.Linear(4, 10)
self.fc2 = nn.Linear(10, 3)
self.softmax = nn.Softmax(dim=1)
def forward(self, x):
x = self.fc1(x)
x = self.fc2(x)
x = self.softmax(x)
return x
# 实例化模型和损失函数
net = Net()
criterion = nn.CrossEntropyLoss()
# 定义优化器
optimizer = optim.SGD(net.parameters(), lr=0.01)
# 训练模型
for epoch in range(1000):
# 将数据转换为 tensor 类型
inputs = torch.from_numpy(X_train).float()
labels = torch.from_numpy(y_train.argmax(axis=1)).long()
# 将梯度缓存清零
optimizer.zero_grad()
# 正向传播
outputs = net(inputs)
loss = criterion(outputs, labels)
# 反向传播
loss.backward()
optimizer.step()
# 打印损失值
if epoch % 100 == 0:
print('Epoch {}, Loss: {:.4f}'.format(epoch, loss.item()))
# 测试模型
net.eval()
inputs = torch.from_numpy(X_test).float()
labels = torch.from_numpy(y_test.argmax(axis=1)).long()
outputs = net(inputs)
_, predicted = torch.max(outputs, 1)
accuracy = (predicted == labels).sum().item() / labels.size(0)
print('Accuracy: {:.2%}'.format(accuracy))
```
上述代码中,我们首先加载鸢尾花数据集,并将标签进行 one-hot 编码,然后划分训练集和测试集。接着定义了一个简单的神经网络模型,包含两个全连接层和一个 softmax 层。损失函数使用交叉熵函数,优化器使用随机梯度下降算法。在训练模型时,每隔 100 个 epoch 打印一次损失值。最后在测试集上测试模型的准确率。
阅读全文