尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Blocks实战:从零训练MNIST手写数字识别模型的完整教程

Blocks实战:从零训练MNIST手写数字识别模型的完整教程 Blocks实战从零训练MNIST手写数字识别模型的完整教程【免费下载链接】blocksA Theano framework for building and training neural networks项目地址: https://gitcode.com/gh_mirrors/blo/blocks想用 Theano 搭建属于自己的第一个神经网络却不知道从哪下手Blocks 正是为此而生的深度学习框架。这篇Blocks 实战教程将带你用 Blocks 从零训练一个MNIST 手写数字识别模型从环境搭建、模型构建到训练监控与结果分析一步步走完完整流程。无论你是刚入门深度学习的新手还是想快速上手 Blocks 的开发者这篇文章都能帮你扫清障碍亲手跑通第一个神经网络项目。什么是 Blocks为什么用它训练神经网络Blocks 是一个基于 Theano 的神经网络构建与训练框架由蒙特利尔大学 MILA 实验室维护。它的核心思想是砖块Brick——一种参数化的 Theano 运算单元。你可以像搭积木一样组合砖块快速构建出复杂的神经网络结构。Blocks 的核心能力包括Bricks 砖块体系用参数化模块构建模型如全连接层、激活函数等训练算法内置梯度下降、动量、Adam 等优化器训练监控实时记录并分析训练过程中的损失与准确率模型保存与恢复支持断点续训训练中断也不怕这套设计让 Blocks 在当年成为深度学习入门的热门选择尤其适合理解神经网络的底层原理。认识 MNIST 手写数字识别任务MNIST 是深度学习界的Hello World包含 70,000 张 28×28 像素的灰度手写数字图片任务是把每张图片正确分类到 0 到 9 的十个类别中。训练一个 MNIST 手写数字识别模型就是让神经网络学会从像素特征推断数字标签。我们需要做的核心工作是把 784 维28×28的像素特征映射到一个 10 维的概率分布上每个维度对应一个数字类别的预测概率。第一步搭建 Blocks 训练环境在开始之前需要安装 Blocks 及其依赖。Blocks 依赖 Theano、PyYAML、six、Toolz 等库安装命令如下pip install githttps://gitcode.com/gh_mirrors/blo/blocks.git -r requirements.txt 小提示建议使用 Anaconda 之类的科学计算发行版确保 NumPy 和 SciPy 链接了优化的 BLAS 库训练速度会明显提升。安装完成后确认 Theano 版本足够新就可以进入下一步了。第二步用 Bricks 构建多层感知机模型在 Blocks 中构建模型就是组合砖块。我们采用一个隐藏层的多层感知机MLP输入层 784 维 → 隐藏层 100 维ReLU 激活→ 输出层 10 维Softmax。首先定义 Theano 输入变量注意名称必须与数据源匹配from theano import tensor x tensor.matrix(features)然后用 Linear、Rectifier、Softmax 三个砖块拼接模型from blocks.bricks import Linear, Rectifier, Softmax input_to_hidden Linear(nameinput_to_hidden, input_dim784, output_dim100) h Rectifier().apply(input_to_hidden.apply(x)) hidden_to_output Linear(namehidden_to_output, input_dim100, output_dim10) y_hat Softmax().apply(hidden_to_output.apply(h))如果想更简洁Blocks 还提供了开箱即用的MLP类一行搞定同样结构的网络from blocks.bricks import MLP mlp MLP(activations[Rectifier(), Softmax()], dims[784, 100, 10]).apply(x)砖块的实现代码位于 blocks/bricks/simple.py而 MLP 封装在 blocks/bricks/sequences.py感兴趣的读者可以直接阅读源码。第三步定义损失函数并初始化参数有了模型输出还需要定义损失函数来度量预测与真实标签的差距。我们使用交叉熵损失负对数似然y tensor.lmatrix(targets) from blocks.bricks.cost import CategoricalCrossEntropy cost CategoricalCrossEntropy().apply(y.flatten(), y_hat)为了防止过拟合可以加上 L2 正则项。Blocks 提供了变量筛选工具能轻松取出模型中的权重矩阵from blocks.roles import WEIGHT from blocks.graph import ComputationGraph from blocks.filter import VariableFilter cg ComputationGraph(cost) W1, W2 VariableFilter(roles[WEIGHT])(cg.variables) cost cost 0.005 * (W1 ** 2).sum() 0.005 * (W2 ** 2).sum()接下来初始化参数——砖块默认把参数设为 NaN我们需要用随机分布填充权重、用常量填充偏置from blocks.initialization import IsotropicGaussian, Constant input_to_hidden.weights_init hidden_to_output.weights_init IsotropicGaussian(0.01) input_to_hidden.biases_init hidden_to_output.biases_init Constant(0) input_to_hidden.initialize() hidden_to_output.initialize()这里权重从标准差为 0.01 的正态分布中采样偏置初始化为 0。第四步加载 MNIST 数据并配置训练算法Blocks 通常搭配 Fuel 数据框架使用。加载 MNIST 训练集和测试集并用数据流按批次喂给模型from fuel.datasets import MNIST from fuel.streams import DataStream from fuel.schemes import SequentialScheme from fuel.transformers import Flatten mnist MNIST((train,)) data_stream Flatten(DataStream.default_stream( mnist, iteration_schemeSequentialScheme(mnist.num_examples, batch_size256)))训练算法选择随机梯度下降SGD固定学习率 0.1from blocks.algorithms import GradientDescent, Scale algorithm GradientDescent(costcost, parameterscg.parameters, step_ruleScale(learning_rate0.1))Blocks 内置了丰富的优化器包括动量、AdaGrad、RMSProp、Adam 等全部位于 blocks/algorithms/init.py进阶玩家可以自由切换。第五步用 MainLoop 训练并监控损失曲线Blocks 的MainLoop主循环把数据流、算法和扩展组件整合在一起统一驱动训练流程。我们为测试集创建监控扩展实时评估模型在未见数据上的表现mnist_test MNIST((test,)) data_stream_test Flatten(DataStream.default_stream( mnist_test, iteration_schemeSequentialScheme( mnist_test.num_examples, batch_size1024))) from blocks.extensions.monitoring import DataStreamMonitoring monitor DataStreamMonitoring( variables[cost], data_streamdata_stream_test, prefixtest) from blocks.main_loop import MainLoop from blocks.extensions import FinishAfter, Printing main_loop MainLoop(data_streamdata_stream, algorithmalgorithm, extensions[monitor, FinishAfter(after_n_epochs1), Printing()]) main_loop.run()监控扩展的实现细节可以参考 blocks/extensions/monitoring.pyMainLoop的调度逻辑在 blocks/main_loop.py。观察训练结果损失曲线怎么看训练结束后日志会输出每个 epoch 的损失值。从第一次迭代到第一个 epoch 结束测试集损失会明显下降——这正是模型在学习的证据BEFORE FIRST EPOCH test_cost_with_regularization: 2.34244632721 AFTER ANOTHER EPOCH test_cost_with_regularization: 0.664899230003把每个 batch 的损失值绘制成曲线你会看到一条典型的训练损失曲线——整体单调下降、逐步收敛图中纵轴是损失值cost横轴是迭代次数。损失快速下降后趋于平稳说明模型收敛良好。如果曲线长期不下降可以尝试调大学习率如果训练损失降了但测试损失反弹则要警惕过拟合加强正则化。进阶玩法模型保存与断点续训训练到一半被中断怎么办Blocks 提供了 Checkpoint 扩展可以定期保存模型参数和训练状态from blocks.extensions.saveload import Checkpoint checkpoint Checkpoint(mnist_model.pkl, after_epochTrue)配合 Load 扩展下次训练时即可从断点恢复无需从头开始。相关实现见 blocks/extensions/saveload.py。小结你的第一个 Blocks 神经网络已跑通通过这篇 Blocks 实战教程你已经走完了从环境搭建到训练完成的全流程用砖块构建 MLP、定义交叉熵损失、配置 SGD 算法、通过 MainLoop 训练并监控损失曲线。这套流程是深度学习项目的通用骨架掌握后无论是换数据集还是换网络结构都能举一反三。下一步挑战建议试着把单隐藏层换成更深的网络或者切换成 Adam 优化器观察损失曲线的变化——动手实验是理解神经网络最快的途径。祝你在深度学习之路上越走越远【免费下载链接】blocksA Theano framework for building and training neural networks项目地址: https://gitcode.com/gh_mirrors/blo/blocks创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表