使用iris.csv数据构建神经网络预测花的种类:将所有数据随机分为训练集和测试集,分别计算测试集上总的准确率和不同类的准确率,要求使用torch
时间: 2024-02-06 10:12:09 浏览: 29
好的,我理解了你的问题。首先,我们需要导入所需的库和数据集:
```python
import torch
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
from torch.utils.data import TensorDataset, DataLoader
# 加载数据集
data = pd.read_csv('iris.csv')
# 将标签进行编码
le = LabelEncoder()
data['species'] = le.fit_transform(data['species'])
# 划分数据集
train_data, test_data = train_test_split(data, test_size=0.2)
```
接下来,我们将数据集转换为张量,并创建一个`DataLoader`对象:
```python
# 将数据集转换为张量
X_train = torch.tensor(train_data.iloc[:, :-1].values, dtype=torch.float32)
y_train = torch.tensor(train_data.iloc[:, -1].values, dtype=torch.int64)
X_test = torch.tensor(test_data.iloc[:, :-1].values, dtype=torch.float32)
y_test = torch.tensor(test_data.iloc[:, -1].values, dtype=torch.int64)
# 创建一个TensorDataset对象
train_dataset = TensorDataset(X_train, y_train)
test_dataset = TensorDataset(X_test, y_test)
# 创建一个DataLoader对象
batch_size = 16
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False)
```
接下来,我们定义一个简单的神经网络,并使用交叉熵损失函数和随机梯度下降优化器进行训练:
```python
# 定义一个简单的神经网络
class Net(torch.nn.Module):
def __init__(self):
super(Net, self).__init__()
self.fc1 = torch.nn.Linear(4, 16)
self.fc2 = torch.nn.Linear(16, 3)
def forward(self, x):
x = torch.relu(self.fc1(x))
x = self.fc2(x)
return x
# 训练模型
net = Net()
criterion = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(net.parameters(), lr=0.01)
num_epochs = 100
for epoch in range(num_epochs):
for data in train_loader:
inputs, labels = data
optimizer.zero_grad()
outputs = net(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
# 在训练集上计算准确率
total = 0
correct = 0
with torch.no_grad():
for data in train_loader:
inputs, labels = data
outputs = net(inputs)
_, predicted = torch.max(outputs.data, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
train_acc = correct / total
# 在测试集上计算准确率
total = 0
correct = 0
class_correct = list(0. for i in range(3))
class_total = list(0. for i in range(3))
with torch.no_grad():
for data in test_loader:
inputs, labels = data
outputs = net(inputs)
_, predicted = torch.max(outputs.data, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
c = (predicted == labels).squeeze()
for i in range(labels.size(0)):
label = labels[i]
class_correct[label] += c[i].item()
class_total[label] += 1
test_acc = correct / total
class_acc = [class_correct[i] / class_total[i] for i in range(3)]
print(f'Epoch {epoch+1}, train_acc: {train_acc:.4f}, test_acc: {test_acc:.4f}, class_acc: {class_acc}')
```
这样,我们就完成了使用PyTorch构建神经网络预测鸢尾花种类的任务。每个epoch的输出结果中,`train_acc`表示训练集上的准确率,`test_acc`表示测试集上的准确率,`class_acc`表示不同类别在测试集上的准确率。