DAY35作业

知识点回顾:

  1. 三种不同的模型可视化方法:推荐torchinfo打印summary+权重分布可视化
  2. 进度条功能:手动和自动写法,让打印结果更加美观
  3. 推理的写法:评估模式

作业:调整模型定义时的超参数,对比下效果。

1.鸢尾花数据集(Iris dataset)是机器学习和统计学中常用的经典数据集:

基本信息

  • 样本数量:共 150 个样本。
  • 特征数量:每个样本有 4 个特征,分别为萼片长度、萼片宽度、花瓣长度、花瓣宽度 ,单位均为厘米。
  • 类别数量:包含 3 个品种类别,即山鸢尾(Setosa)、变色鸢尾(Versicolor)、维吉尼亚鸢尾(Virginica) ,每个类别有 50 个样本。

2.在神经网络中,** 隐藏层(Hidden Layer)输出层(Output Layer)** 是模型的关键组成部分,负责特征提取和结果预测

    # 初始化模型和优化器
    model = MLP(hidden_size=config["hidden_size"]).to(device)
    criterion = nn.CrossEntropyLoss()
    
    if config["optimizer"] == "SGD":
        optimizer = optim.SGD(model.parameters(), lr=config["lr"])
    elif config["optimizer"] == "Adam":
        optimizer = optim.Adam(model.parameters(), lr=config["lr"])
    
    losses = []  # 用于保存每个epoch的loss
    start_time = time.time()
    
    with tqdm(total=num_epochs, desc="训练进度", unit="epoch") as pbar:
        for epoch in range(num_epochs):
            # 训练步骤
            model.train()
            outputs = model(X_train)
            loss = criterion(outputs, y_train)
            
            optimizer.zero_grad()
            loss.backward()
            optimizer.step()
            
            # 每200个epoch记录一次loss
            if (epoch + 1) % 200 == 0:
                losses.append(loss.item())
                pbar.set_postfix({'Loss': f'{loss.item():.4f}'})
            
            # 更新进度条
            if (epoch + 1) % 1000 == 0 or (epoch + 1) == num_epochs:
                pbar.update(1000 if (epoch + 1) % 1000 == 0 else num_epochs % 1000)
    
    # 测试准确率
    model.eval()
    with torch.no_grad():
        outputs = model(X_test)
        _, predicted = torch.max(outputs, 1)
        accuracy = (predicted == y_test).sum().item() / y_test.size(0)
    
    # 保存结果(确保包含losses)
    results.append({
        "config": config,
        "time": time.time() - start_time,
        "accuracy": accuracy,
        "final_loss": losses[-1] if losses else float('inf'),
        "losses": losses.copy()  # 明确保存losses的副本
    })
 
# 结果对比
print("\n===== 超参数对比结果 =====")
for i, res in enumerate(results):
    print(f"配置{i+1}: {res['config']}")
    print(f"训练时间: {res['time']:.2f}s | 测试准确率: {res['accuracy']*100:.2f}% | 最终Loss: {res['final_loss']:.4f}\n")
 
# 可视化损失曲线
plt.figure(figsize=(12, 6))
for i, res in enumerate(results):
    if 'losses' in res and len(res['losses']) > 0:  # 安全检查
        epochs_to_plot = range(0, len(res['losses']) * 200, 200)
        plt.plot(epochs_to_plot, res['losses'], label=f"配置{i+1}: {res['config']}")
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.title('Training Loss Comparison')
plt.legend()
plt.grid(True)
plt.show()
当前超参数配置: {'lr': 0.01, 'hidden_size': 10, 'optimizer': 'SGD'}

当前超参数配置: {'lr': 0.001, 'hidden_size': 20, 'optimizer': 'Adam'}

当前超参数配置: {'lr': 0.1, 'hidden_size': 5, 'optimizer': 'SGD'}
使用设备: cuda:0

当前配置: {'lr': 0.01, 'hidden_size': 10, 'optimizer': 'SGD'}
训练进度: 100%|██████████| 2000/2000 [00:06<00:00, 326.97epoch/s, Loss=0.3631]

当前配置: {'lr': 0.001, 'hidden_size': 20, 'optimizer': 'Adam'}
训练进度: 100%|██████████| 2000/2000 [00:08<00:00, 231.07epoch/s, Loss=0.0601]

当前配置: {'lr': 0.1, 'hidden_size': 5, 'optimizer': 'SGD'}
训练进度: 100%|██████████| 2000/2000 [00:04<00:00, 448.62epoch/s, Loss=0.0601]

===== 超参数对比结果 =====
配置1: {'lr': 0.01, 'hidden_size': 10, 'optimizer': 'SGD'}
训练时间: 6.14s | 测试准确率: 93.33% | 最终Loss: 0.3631

配置2: {'lr': 0.001, 'hidden_size': 20, 'optimizer': 'Adam'}
训练时间: 8.67s | 测试准确率: 96.67% | 最终Loss: 0.0601

配置3: {'lr': 0.1, 'hidden_size': 5, 'optimizer': 'SGD'}
训练时间: 4.47s | 测试准确率: 96.67% | 最终Loss: 0.0601

d:\anaconda\envs\DLshenduxuexi\lib\site-packages\IPython\core\pylabtools.py:152: UserWarning: Glyph 37197 (\N{CJK UNIFIED IDEOGRAPH-914D}) missing from current font.
  fig.canvas.print_figure(bytes_io, **kw)
d:\anaconda\envs\DLshenduxuexi\lib\site-packages\IPython\core\pylabtools.py:152: UserWarning: Glyph 32622 (\N{CJK UNIFIED IDEOGRAPH-7F6E}) missing from current font.
  fig.canvas.print_figure(bytes_io, **kw)

DAY35作业_第1张图片

@浙大疏锦行

你可能感兴趣的:(Python打卡训练营内容,算法,深度学习,人工智能)