欢迎光临
我们一直在努力

Day36 简单的神经网络

@浙大疏锦行

作业:对鸢尾花通过pytorch进行训练

import torch
import torch.nn as nn
import torch.optim as optim
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report, confusion_matrix, accuracy_score
import warnings

# 忽略警告信息
warnings.filterwarnings("ignore")

# 1. 配置与检查
print(f"PyTorch Version: {torch.__version__}")
print(f"CUDA Available: {torch.cuda.is_available()}")

# 定义模型结构 (MLP)
class MLP(nn.Module):
def __init__(self):
super(MLP, self).__init__()
self.fc1 = nn.Linear(4, 10)
self.relu = nn.ReLU()
self.fc2 = nn.Linear(10, 3)

def forward(self, x):
out = self.fc1(x)
out = self.relu(out)
out = self.fc2(out)
return out

def run_pytorch_training():
print("\\n— 开始 PyTorch MLP 训练 —")

# 加载数据
iris = load_iris()
X = iris.data
y = iris.target

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 打印尺寸
print(f"X_train shape: {X_train.shape}")
print(f"y_train shape: {y_train.shape}")
print(f"X_test shape: {X_test.shape}")
print(f"y_test shape: {y_test.shape}")

# 归一化数据
scaler = MinMaxScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

# 转换为 PyTorch 张量
X_train = torch.FloatTensor(X_train)
y_train = torch.LongTensor(y_train)
X_test = torch.FloatTensor(X_test)
y_test = torch.LongTensor(y_test)

# 实例化模型
model = MLP()

# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)

# 训练循环
num_epochs = 20000
losses = []

for epoch in range(num_epochs):
# forward
outputs = model(X_train)
loss = criterion(outputs, y_train)

# backward
optimizer.zero_grad()
loss.backward()
optimizer.step()

# 记录损失
losses.append(loss.item())

if (epoch + 1) % 1000 == 0: # 为了控制输出行数,我稍微调整了打印频率(原为100)
print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}')

# 可视化 Loss
# 注意:在脚本运行时,程序会暂停在这里直到你关闭绘图窗口
print("正在显示 Loss 曲线,请关闭窗口以继续…")
plt.figure()
plt.plot(range(num_epochs), losses)
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.title('Training Loss over Epochs')
plt.savefig('loss_curve.png')
# plt.show()
print("图形已保存为 loss_curve.png")

# 测试模型
with torch.no_grad():
outputs = model(X_test)
_, predicted = torch.max(outputs.data, 1)
correct = (predicted == y_test).sum().item()
accuracy = correct / y_test.size(0)
print(f'PyTorch Model Accuracy on test set: {accuracy*100:.2f}%')

def run_rf_comparison():
print("\\n— 开始 Random Forest 对比 —")

# 重新加载数据 (保持原有逻辑,不使用归一化数据)
iris = load_iris()
X = iris.data
y = iris.target

X1_train, X1_test, y1_train, y1_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 训练随机森林
model1 = RandomForestClassifier(n_estimators=100, random_state=42)
model1.fit(X1_train, y1_train)

# 预测
y1_pred = model1.predict(X1_test)

# 打印评估结果
print("\\nRF 分类报告:")
print(classification_report(y1_test, y1_pred))

print("RF 混淆矩阵:")
print(confusion_matrix(y1_test, y1_pred))

rf_accuracy = accuracy_score(y1_test, y1_pred)
print("RF 模型评估指标:")
print(f"准确率: {rf_accuracy:.4f}")

if __name__ == "__main__":
run_pytorch_training()
run_rf_comparison()

效果图:

赞(0)
未经允许不得转载:171主机测评 » Day36 简单的神经网络
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址