本章开始使用神经网络来解决实际问题,介绍三个问题的解决方法,以及神经网络的核心组件。
1. 神经网络剖析
【第二章】已经介绍了,训练神经网络主要围绕以下四个方面:
- 层,多个层组合成网络(或模型)。
- 输入数据和相应的目标。
- 损失函数,即用于学习的反馈信号。
- 优化器,决定学习过程如何进行。
这四者的关系为:
-
1. 层:深度学习的基础组件
- 层是一个数据处理模块,将一个或多个输入张量转换为一个或多个输出张量。
- 有些层是无状态的,但大多数层都是有状态的,即层的权重。权重是利用随机梯度下降(SGD)学到的一个或多个张量,其中包含了网络的知识。
- 不同的张量格式与不同的数据处理类型需要用到不同的层。
- 简单的向量数据保存在形状为(samples, features)的2D张量中,通常用密集连接层(densely connected layer,也叫全连接层 - fully connected layer,密集层 - dense layer),对应于Keras中的Dense类来处理
- 序列数据保存在形状为 (samples, timesteps, features) 的 3D 张量中,通常用循环层(recurrent layer,比如 Keras 的 LSTM 层)来处理。
- 图像数据保存在 4D 张量中,通常用二维卷积层(Keras 的 Conv2D )来处理。
- 实例:
第一层需要制定input数据格式,第二层不用指定,Keras可以自动推导出输入形状。model = models.Sequential() model.add(layers.Dense(32, input_shape=(784,))) model.add(layers.Dense(32))
-
2. 模型:层构成的网络
选择正确的网络架构更像是一门艺术而不是科学。虽然有一些最佳实践和原则,但只有动手实践才能让你成为合格的神经网络架构师。- 最常见的是序列模型,上例中的Sequential,将单一输入映射到单一输出
- 双分支(two-branch)网络
- 多头(multihead)网络
- Inception 模块
-
3. 损失函数与优化器:配置学习过程的关键
- 损失函数(目标函数)—— 在训练过程中需要将其最小化。它能够衡量当前任务是否已成功完成。
- 优化器 —— 决定如何基于损失函数对网络进行更新。 它执行的是随机梯度下降(SGD)的某个变体。
- 具有多个输出的神经网络可能具有多个损失函数(每个输出对应一个损失函数)。但是,梯度下降过程必须基于单个标量损失值。因此,对于具有多个损失函数的网络,需要将所有损失 函数取平均,变为一个标量值。
- 对于分类、回归、序列预测等常见问题,你可以遵循一些简单的指导原则来选择正确的损失函数。参考方案如下:
- 只有在面对真正全新的研究问题时,你才需要自主开发目标函数。
2. Keras简介
- 不同深度学习框架的 Google 网页搜索热度的变化趋势
- 目前,Keras 有三个后端实现:TensorFlow 后端、 Theano 后端和微软认知工具包(CNTK,Microsoft cognitive toolkit)后端。推荐使用 TensorFlow 后端作为大部分深度学习任务的默认后端,因为它 的应用最广泛,可扩展,而且可用于生产环境。
通过 TensorFlow(或 Theano、CNTK),Keras 可以在 CPU 和 GPU 上无缝运行。在 CPU 上运行 时,TensorFlow 本身封装了一个低层次的张量运算库,叫作 Eigen;在 GPU 上运行时,TensorFlow 封装了一个高度优化的深度学习运算库,叫作 NVIDIA CUDA 深度神经网络库(cuDNN)。
3. 建立深度学习工作站
-
强烈推荐你在现代 NVIDIA GPU 上运行深度学习实验。
- 也可以考虑在 AWS EC2 GPU 实例或 Google 云平台上运行深 度学习实验。但请注意,时间一长,云端 GPU 实例可能会变得非常昂贵。
-
最好都使用 UNIX 工作站。
-
Jupyter 笔记本:运行深度学习实验的首选方法
- 它广泛用于数据科学和机器学习领域。
- 具有丰富的文本编辑功能,可以对代码进行注释。
- 笔记本还可以将冗长的实验代码拆分为可独立执行的短代码,这使得开发具有交互性,
- 如果后面的代码出现问题,也不必重新运行前面的所有代码。
- 个人实践总结:
- 在初期开发中,推荐使用jupyter编辑、运行代码,方便写出正确的代码以及改错
- 在代码开发完成后,可以使用导出功能,将notebook文件导出为.py脚本,
- 使用shell脚本运行导出的.py脚本,修改参数,多次调用.py文件
- 可参考:
- shell 参数换行 中的代码样例
- 待续~
-
在云端运行深度学习任务:优点和缺点
- 优点:简单又低成本
- 缺点:价格高昂
- 简而言之,EC2 是很好的上手方法。你完全可以在 EC2 GPU 实例上运行本书的代码示例。 但如果你想成为深度学习的高手,那就自己买 GPU。
4. 实例
实例部分拆解为各篇文章,可以通过点击下面的进行查看:
待续~