和鲸社区深度学习基础训练营2025年关卡2(2)sklearn中的MLPClassifier

拟分3种实现方法:

1.纯numpy

2.sklearn中的MLPClassifier

3.pytorch

题目:

在 MNIST 数据集上训练 MLP 模型并比较不同的激活函数和优化算法

任务描述:

使用 MNIST 数据集中的前 20,000 个样本训练一个多层感知机 (MLP) 模型。你需要比较三种不同的激活函数(ReLU、Sigmoid、Tanh)和三种不同的优化算法(SGD、Momentum、Adam),以找到表现最好的组合。模型需要使用一层隐藏层,隐藏单元数量为 128。

要求:

加载并预处理数据,将每个图像展平成 28x28 的向量,并进行标准化(除以 255)。

使用 one-hot 编码将标签进行转换。

在训练过程中,分别使用以下激活函数和优化算法:

激活函数:ReLU、Sigmoid、Tanh

优化算法:SGD、Momentum、Adam

对每种激活函数和优化算法组合,训练模型 10000 个 epoch。

评估模型在验证集上的准确率,并输出最优的激活函数与优化算法组合。

输入:

训练数据:MNIST 数据集中的前 20,000 个样本。

每个样本是一个 28x28 的灰度图像,标签为 0-9 的分类。

输出:

输出最优激活函数与优化算法组合,以及在验证集上的准确率。

要求:

不同激活函数与优化算法的组合实现。

对模型的正确率进行评估,并选择最优方案。

提示:

你可以使用 OneHotEncoder 将标签进行 one-hot 编码。

在模型的反向传播过程中,根据不同的优化算法更新权重。

激活函数可以用 ReLU、Sigmoid 和 Tanh,确保在前向传播和反向传播时分别计算激活值及其导数。

特别说明:

sklearn的MLPClassifier激活函数只有以下四种:{'identity', 'logistic', 'tanh', 'relu'}, 'relu',默认relu。其中'logistic'其实就是sigmod,f(x) = 1 / (1 + exp(-x))。

优化算法只有以下三种: {'lbfgs', 'sgd', 'adam'}, 默认adam,用来优化权重。

所以题目中的'Momentum'优化算法只能忍痛割爱了!

python 复制代码
#sklearn: MLPClassifier
import numpy as np
from sklearn.preprocessing import OneHotEncoder
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.neural_network import MLPClassifier
from sklearn.preprocessing import StandardScaler
np.random.seed(999)

def load_data(path="mnist.npz"):
    # np.load加载数据文件
    f = np.load(path)
    # 提取训练集和测试集的图片和标签数据
    X_train, y_train = f['x_train'], f['y_train']
    X_test, y_test = f['x_test'], f['y_test']
    f.close()  # 关闭文件
    # 返回训练集和测试集
    return (X_train, y_train), (X_test, y_test)

# 加载MNIST数据集
(X_train, y_train), (X_test, y_test) = load_data()

X_train=X_train[:2000]
y_train=y_train[:2000]
X_test=X_test[:1000]
y_test=y_test[:1000]
# 数据预处理
X_train = X_train.reshape((-1,  28 * 28)).astype('float32') / 255
X_test = X_test.reshape((-1,  28 * 28)).astype('float32') / 255

# 标签进行独热编码
def one_hot_encoding(labels, num_classes):
    encoded = np.zeros((len(labels),  num_classes))
    for i, label in enumerate(labels):
        encoded[i][label] = 1
    return encoded

y_train = one_hot_encoding(y_train, 10)
y_test = one_hot_encoding(y_test, 10)

# 创建MLP模型
input_size = 28 * 28
hidden_size = 128
output_size = 10

# 训练模型
lr = 0.001
epochs = 1000

# 训练和评估模型
best_accuracy = 0  # 保存最佳模型的准确率
best_model = None  # 保存最佳模型
best_activation = None  # 保存最佳的激活函数
best_optimizer = None  # 保存最佳的优化器

for activation in ['relu', 'logistic', 'tanh']:  # 激活函数分别为ReLU、Sigmoid、Tanh
    for optimizer in ['sgd', 'adam']:  # 优化器分别为SGD、Adam
        print(f"\nTraining with {activation} activation and {optimizer} optimizer")

        # 训练模型
        mlp=MLPClassifier((128,),activation=activation,solver=optimizer,max_iter=epochs,learning_rate_init=lr)
        mlp.fit(X_train,y_train)
        y_pred = mlp.predict(X_test)
        #accuracy = np.mean(np.argmax(y_test, axis=1) == y_pred)
        accuracy = accuracy_score(y_test, y_pred)
        print(f"测试集准确率: {accuracy * 100:.2f}%")
        # 保存最佳模型
        if accuracy > best_accuracy:
            best_accuracy = accuracy # 保存最佳模型的准确率
            best_model = None  # 保存最佳模型
            best_activation = activation  # 保存最佳的激活函数
            best_optimizer = optimizer # 保存最佳的优化器

print(f"\nBest model with activation '{best_activation}' and optimizer '{best_optimizer}'")
print(f"Validation Accuracy: {best_accuracy * 100:.2f}%")

运行结果:

其中'logistic'其实就是sigmod。

相关推荐
测试员周周4 小时前
【Appium 系列】第16节-WebView-H5上下文切换 — 混合应用的自动化难点
运维·开发语言·人工智能·功能测试·appium·自动化·测试用例
K姐研究社6 小时前
怎么用AI制作电商口播视频,开拍APP一键生成
人工智能·音视频
LaughingZhu6 小时前
Product Hunt 每日热榜 | 2026-05-21
前端·人工智能·经验分享·chatgpt·html
传说故事7 小时前
【论文阅读】MotuBrain: An Advanced World Action Model for Robot Control
论文阅读·人工智能·具身智能·wam
北京耐用通信7 小时前
全域适配工业场景耐达讯自动化Modbus TCP 转 PROFIBUS 网关轻松实现以太网与现场总线互通
网络·人工智能·网络协议·自动化·信息与通信
火山引擎开发者社区7 小时前
TRAE × 火山引擎 Supabase:为你的 AI 应用装上“数据引擎”
人工智能
weixin_446260858 小时前
[特殊字符] 视觉Transformer (ViT) 原理及性能突破:从CNN到大规模自注意力机制的迁移
深度学习·cnn·transformer
小a彤8 小时前
GE 在 CANN 五层架构中的位置
人工智能·深度学习·transformer
前端若水8 小时前
会话管理:创建、切换、删除对话历史
前端·人工智能·python·react.js
Upsy-Daisy8 小时前
AI Agent 项目学习笔记(八):Tool Calling 工具调用机制总览
人工智能·笔记·学习