深度学习的“Hello World”

回到上一篇 了解机器学习(深度学习)的几个特点
本文目的是通过深度学习的“Hello World”,向读者展示神经网络的训练过程,是用不那么技术化的文字帮你建立对神经网络的直觉。我们将避免使用数学符号,因为数学符号可能会令没有任何数学背景的人反感,而且对解释问题也不是绝对必要的。本文真正目的不是要解决什么手写识别问题,而是通过这个小小的例子引出深度学习后面你需要了解和掌握的知识技术范围。

问题描述

我们这里要解决的问题是,将手写数字的灰度图像(28 像素×28 像素)划分到 10 个类别中(0~9)。我们将使用 MNIST 数据集,它是机器学习领域的一个经典数据集,其历史几乎和这个领域一样长,而且已被人们深入研究。这个数据集包含 60 000 张训练图像和 10 000 张测试图像,由美国国家标准与技术研究院(National Institute of Standards and Technology,即 MNIST 中 的 NIST)在20世纪80年代收集得到。你可以将“解决”MNIST 问题看作深度学习的“Hello World”,正是用它来验证你的算法是否按预期运行。当你成为机器学习从业者后,会发现MNIST一次又一次地出现在科学论文、博客文章等中。在机器学习中,分类问题中的某个类别叫作类(class)。数据点叫作样本(sample)。某个样本对应的类叫作标签(label)
下图给出了 MNIST 数据集的一些样本。

图1-1 MNIST手写数字图

深度学习的“套路”

套用一句流行术语,套路来说,深度学习解决问题的原理或”套路“如下图所示:

图1-2 神经网络训练处理流程

上图是深度学习解决问题的大致流程,不管神经网络深度(层数)有多深,都基本是这个流程。从简单的训练权重网络、到加入损失函数到神经网络、到加入优化器到完整神经网络处理流程。
深度学习训练的最终目的是得到一个合适的权重,而要计算出权重需要构建神经网络、选择损失函数、优化器、学习效率以及激活函数等,这些都是为最终训练出合适的权重,简单来说就是这样。
构建神经网络的核心组件是层(layer),它可以把它理解为是一种数据处理模块,看成数据过滤器。进去一些数据,出来的数据变得更加有用。具体来说,层从输入数据中提取表示——我们期望这种表示有助于解决手头的问题。大多数深度学习都是将简单的层链接起来,从而实现渐进式的数据蒸馏(data distillation)。深度学习模型就像是数据处理的筛子,包含一系列越来越精细的 数据过滤器(即层)。经典的卷积神经网络,如VGG,AlexNet,ResNet,GoogleNet,都有较深较复杂的网络结构。

MNIST深度网络构建

按照上述的“套路”,首先构建神经网络,本例设计网络包含 2 个 Dense 层,它们是密集连接(也叫全连接)的神经层。第二层(也是最后一层)是一个 10 路 softmax 层,它将返回一个由 10 个概率值(总和为 1)组成的数组。 每个概率值表示当前

### 深度学习入门示例:MNIST 数据集 深度学习的入门级经典教程通常以 MNIST 数据集为例[^1]。该数据集包含了手写数字的灰度图像,每张图片尺寸为 28×28 像素,共有 0 到 9 十个类别标签。通过训练模型来识别这些手写数字,可以初步掌握深度学习的核心流程。 #### 深度学习的基础框架 从历史角度看,现代深度学习的概念起源于 Frank Rosenblatt 提出的感知机理论[^2]。随后 Alexey Ivakhnenko 和 Lapa 开发了首个适用于监督学习的多层前馈网络的学习算法。这标志着深度学习从理论迈向实际应用的重要一步。 #### 实现过程概述 实现一个简单的深度学习程序大致分为五个阶段[^2]: 1. **加载数据**:获取并预处理 MNIST 数据集。 2. **构建模型**:定义神经网络结构,例如全连接层、激活函数等。 3. **编译模型**:指定损失函数和优化器。 4. **训练模型**:利用训练数据调整权重参数。 5. **评估性能**:测试模型在未见过的数据上的表现。 以下是基于 Java 的简单代码片段展示如何搭建一个多层感知器 (MLP)[^4]: ```java // 定义输入维度(即展开后的像素数量) long inputSize = 28 * 28; // 输出维度对应于十类不同的数字 long outputSize = 10; SequentialBlock block = new SequentialBlock(); block.add(Blocks.batchFlattenBlock(inputSize)); block.add(Linear.builder().setUnits(128).build()); block.add(Activation::relu); block.add(Linear.builder().setUnits(64).build()); block.add(Activation::relu); block.add(Linear.builder().setUnits(outputSize).build()); System.out.println(block.toString()); ``` 上述代码创建了一个具有两隐藏层的神经网络架构,并采用了 ReLU 激活函数促进非线性映射能力。 #### 更新权重的关键点 尽管前面提到的操作看似直观,但在实践中最复杂的是第四步——更新模型权重的过程[^3]。此环节涉及反向传播算法计算梯度方向及幅度,从而指导各权值朝降低误差的方向逐步修正。 --- 问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

科技与文明

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值