深度学习入门:从理论到实践
1. 深度学习简介
深度学习是人工智能中令人兴奋的领域,作为机器学习的强大子集,在过去几年里,它在计算机视觉等众多领域取得了显著成果。如今,大数据的可获取性、强大的处理器、更快的互联网速度以及并行计算软硬件的进步,让更多组织和个人能够探索资源密集型的深度学习解决方案。
1.1 Keras与TensorFlow
在深度学习中,Keras为Google的TensorFlow(最广泛使用的深度学习库)提供了友好的接口。Google Mind团队的François Chollet开发Keras,旨在让深度学习能力更易获取。Keras就像机器学习中的Scikit - learn,封装了复杂的数学计算,开发者只需定义、参数化和操作对象,就能从现有组件构建模型并快速调整以满足特定需求。
1.2 深度学习的特点
- 模型实验 :机器学习和深度学习是实证性领域,需要不断尝试多种模型,通过各种方式调整,直到找到最适合应用的模型。Keras便于进行此类实验。
- 数据集大小 :深度学习在数据量大时效果良好,但结合迁移学习和数据增强等技术,对小数据集也有效。迁移学习利用预训练模型的知识构建新模型,数据增强则通过现有数据衍生新数据来扩充数据集。一般来说,数据越多,训练效果越好。
- 处理能力 :深度学习可能需要强大的处理能力,复杂模型在大数据集上训练可能需要数小时甚至数天。不过,本章介绍的模型在普通CPU计算机上几分钟到不到一小时即可完成训练。此外,NVIDIA的GPU和Google的TPU等高性能硬件可满足前沿深度学习应用的处理需求。
- 内置数据集 :Keras自带一些流行数据集,例如MNIST手写数字数据集和IMDb电影评论数据集,可用于练习深度学习。
1.3 深度学习的未来
新的自动化深度学习功能让构建深度学习解决方案变得更简单,如Auto - Keras、Baidu的EZDL和Google的AutoML等。
1.4 深度学习的应用
深度学习应用广泛,包括:
- 游戏玩法
- 计算机视觉:目标识别、模式识别、面部识别
- 自动驾驶汽车
- 机器人技术
- 改善客户体验
- 聊天机器人
- 医疗诊断
- Google搜索
- 面部识别
- 自动图像字幕和视频字幕
- 提高图像分辨率
- 语音识别
- 语言翻译
- 预测选举结果
- 预测地震和天气
- Google Sunroof确定屋顶是否适合安装太阳能板
- 生成式应用:生成原始图像、处理图像使其具有特定艺术风格、为黑白图像和视频添加颜色、创作音乐、生成文本等
1.5 深度学习演示
以下是一些深度学习演示:
- DeepArt.io:将照片转换为具有特定艺术风格的艺术品。 链接
- DeepWarp Demo:分析人物照片并使人物眼睛朝不同方向移动。 链接
- Image - to - Image Demo:将线稿转换为图片。 链接
- Google Translate Mobile App:将照片中的文本翻译成另一种语言。
1.6 Keras资源
学习深度学习时,以下资源可能有帮助:
- Keras团队的Slack频道: 链接
- 文章和教程: 链接
- Keras文档: 链接
- 研究项目和论文: 链接
2. Keras内置数据集
Keras提供了多个用于深度学习实践的数据集:
| 数据集名称 | 用途 | 数据规模 | 图像信息 |
| ---- | ---- | ---- | ---- |
| MNIST手写数字数据库 | 手写数字图像分类 | 60,000张训练图像,10,000张测试图像 | 28×28灰度图像,标签为0 - 9 |
| Fashion - MNIST时尚物品数据库 | 服装图像分类 | 60,000张训练图像,10,000张测试图像 | 28×28灰度图像,10个类别 |
| IMDb电影评论数据集 | 情感分析 | 25,000条训练评论,25,000条测试评论 | 评论标记为积极(1)或消极(0) |
| CIFAR10小图像分类数据集 | 小图像分类 | 50,000张训练图像,10,000张测试图像 | 32×32彩色图像,10个类别 |
| CIFAR100小图像分类数据集 | 小图像分类 | 50,000张训练图像,10,000张测试图像 | 32×32彩色图像,100个类别 |
3. 自定义Anaconda环境
在运行相关示例前,需安装所需库。由于TensorFlow目前不支持Python 3.7,需使用Python 3.6.x。Anaconda可轻松创建自定义环境,便于安装不同库和版本,有助于代码的可重复性。
3.1 创建Anaconda环境
使用 conda create 命令创建TensorFlow环境,例如创建名为 tf_env 的环境:
conda create -n tf_env tensorflow anaconda ipython jupyterlab scikit-learn matplotlib seaborn h5py pydot graphviz
该命令会确定库的依赖关系并显示要安装的库,按提示输入 y 并回车即可创建环境并安装库。
3.2 激活和停用环境
- 激活环境:
conda activate tf_env - 停用环境:
conda deactivate
3.3 Jupyter Notebooks和JupyterLab
本章示例以Jupyter Notebooks形式提供,便于实验。应从 ch15 示例文件夹启动JupyterLab。
4. 神经网络
深度学习通过人工神经网络进行学习。人工神经网络是一种软件结构,其运行方式类似于科学家所认为的大脑工作方式。
4.1 生物神经系统与人工神经元
生物神经系统由神经元通过突触相互通信控制。在神经网络中,相互连接的人工神经元模拟人脑神经元,帮助网络学习。在监督式深度学习中,目标是预测数据样本的目标标签,通过训练通用神经网络模型对未知数据进行预测。
4.2 人工神经网络结构
以下是一个三层神经网络的示例:
graph LR
classDef neuron fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
A1([Input 1]):::neuron --> B1([Hidden 1]):::neuron
A1 --> B2([Hidden 2]):::neuron
A1 --> B3([Hidden 3]):::neuron
A2([Input 2]):::neuron --> B1
A2 --> B2
A2 --> B3
A3([Input 3]):::neuron --> B1
A3 --> B2
A3 --> B3
B1 --> C1([Output 1]):::neuron
B2 --> C1
B3 --> C1
该图展示了一个全连接网络,即每一层的每个神经元都与下一层的所有神经元相连。
4.3 学习是一个迭代过程
训练神经网络是一个迭代过程,每次迭代称为一个epoch,每个epoch处理训练数据集中的每个样本一次。epoch的数量是一个超参数,需要根据训练数据和模型进行调整。网络输入是训练样本的特征,部分层从之前层的输出学习新特征,部分层解释这些特征以进行预测。
4.4 人工神经元的激活
在训练阶段,网络为神经元之间的每个连接计算权重。每个神经元将输入乘以连接权重,然后将加权输入的总和传递给激活函数,该函数的输出决定神经元是否激活。网络通过反向传播调整权重,以最小化预测标签与实际标签之间的误差(损失),通常使用梯度下降法优化权重。
5. 张量
深度学习框架通常以张量形式处理数据,张量本质上是多维数组。TensorFlow等框架将数据打包成张量进行数学计算,以实现神经网络学习。
5.1 张量的类型
| 张量维度 | 名称 | 描述 | 示例 |
|---|---|---|---|
| 0D | 标量 | 单个值 | 一个数字 |
| 1D | 向量 | 类似于一维数组 | 传感器的每小时温度读数、一条电影评论的单词 |
| 2D | 矩阵 | 类似于二维数组 | 灰度图像,维度为图像的宽度和高度,元素值为像素强度 |
| 3D | 三维张量 | 类似于三维数组 | 彩色图像,前两维为图像宽度和高度,第三维为像素的RGB分量;也可表示灰度图像集合 |
| 4D | 四维张量 | 彩色图像集合或一个视频,视频的每一帧是一个彩色图像 | |
| 5D | 五维张量 | 视频集合 |
5.2 张量的大小和处理
张量的大小可能非常大,例如4K视频的张量元素数量巨大。高效处理张量至关重要,这是大多数深度学习在GPU上进行的关键原因之一。Google的TPU专门用于张量操作,执行速度比GPU更快。
5.3 高性能处理器
深度学习通常使用以下高性能处理器:
- NVIDIA GPUs:最初用于计算机游戏,处理大量数据比传统CPU快,优化了张量的矩阵运算,NVIDIA的Volta Tensor Cores专为深度学习设计。
- Google TPUs:专门设计用于执行张量操作,速度比GPU更快。
6. 用于视觉的卷积神经网络与MNIST数据集多分类
6.1 加载MNIST数据集
MNIST数据集是深度学习中常用的数据集,用于手写数字图像分类。在使用Keras时,可以通过以下代码加载该数据集:
from tensorflow.keras.datasets import mnist
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
6.2 数据探索
加载数据集后,需要对数据进行探索,了解其基本信息。例如,可以查看训练集和测试集的大小、图像的形状等:
print(f"训练图像数量: {len(train_images)}, 形状: {train_images.shape}")
print(f"训练标签数量: {len(train_labels)}, 形状: {train_labels.shape}")
print(f"测试图像数量: {len(test_images)}, 形状: {test_images.shape}")
print(f"测试标签数量: {len(test_labels)}, 形状: {test_labels.shape}")
6.3 数据准备
在训练模型之前,需要对数据进行预处理。对于MNIST数据集,通常需要将图像数据进行归一化处理,并将标签进行one - hot编码:
from tensorflow.keras.utils import to_categorical
# 归一化处理
train_images = train_images.reshape((60000, 28, 28, 1)).astype('float32') / 255
test_images = test_images.reshape((10000, 28, 28, 1)).astype('float32') / 255
# one - hot编码
train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)
6.4 创建神经网络
使用Keras创建卷积神经网络,通常包含卷积层、池化层、全连接层等:
from tensorflow.keras import models
from tensorflow.keras import layers
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))
model.summary()
6.5 训练和评估模型
编译模型并进行训练,然后使用测试集评估模型的性能:
model.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['accuracy'])
model.fit(train_images, train_labels, epochs=5, batch_size=64)
test_loss, test_acc = model.evaluate(test_images, test_labels)
print(f"测试集损失: {test_loss}, 测试集准确率: {test_acc}")
6.6 保存和加载模型
训练好的模型可以保存下来,以便后续使用,也可以加载已保存的模型:
# 保存模型
model.save('mnist_model.h5')
# 加载模型
from tensorflow.keras.models import load_model
loaded_model = load_model('mnist_model.h5')
7. 使用TensorBoard可视化神经网络训练
TensorBoard是一个强大的可视化工具,可以帮助我们直观地了解神经网络的训练过程。
7.1 配置TensorBoard回调
在训练模型时,配置TensorBoard回调:
from tensorflow.keras.callbacks import TensorBoard
import datetime
log_dir = "logs/fit/" + datetime.datetime.now().strftime("%Y%m%d-%H%M%S")
tensorboard_callback = TensorBoard(log_dir=log_dir, histogram_freq=1)
model.fit(train_images, train_labels,
epochs=5,
batch_size=64,
validation_data=(test_images, test_labels),
callbacks=[tensorboard_callback])
7.2 启动TensorBoard
在命令行中启动TensorBoard:
tensorboard --logdir=logs/fit
然后在浏览器中打开 http://localhost:6006 ,即可查看训练过程的可视化结果。
8. ConvnetJS:基于浏览器的深度学习训练和可视化
ConvnetJS是一个基于浏览器的深度学习库,允许在浏览器中进行深度学习模型的训练和可视化。其使用流程如下:
1. 访问ConvnetJS的官方网站。
2. 选择合适的示例或创建自己的模型。
3. 在浏览器中进行模型的训练和调整。
4. 可视化模型的训练过程和结果。
9. 用于序列的循环神经网络与IMDb数据集情感分析
9.1 加载IMDb电影评论数据集
使用Keras加载IMDb数据集:
from tensorflow.keras.datasets import imdb
(train_data, train_labels), (test_data, test_labels) = imdb.load_data(num_words=10000)
9.2 数据探索
查看数据集的基本信息,如训练集和测试集的大小:
print(f"训练数据数量: {len(train_data)}, 训练标签数量: {len(train_labels)}")
print(f"测试数据数量: {len(test_data)}, 测试标签数量: {len(test_labels)}")
9.3 数据准备
对数据进行预处理,例如将评论数据进行向量化处理:
import numpy as np
def vectorize_sequences(sequences, dimension=10000):
results = np.zeros((len(sequences), dimension))
for i, sequence in enumerate(sequences):
results[i, sequence] = 1.
return results
x_train = vectorize_sequences(train_data)
x_test = vectorize_sequences(test_data)
y_train = np.asarray(train_labels).astype('float32')
y_test = np.asarray(test_labels).astype('float32')
9.4 创建神经网络
使用Keras创建循环神经网络:
from tensorflow.keras import models
from tensorflow.keras import layers
model = models.Sequential()
model.add(layers.Dense(16, activation='relu', input_shape=(10000,)))
model.add(layers.Dense(16, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))
model.compile(optimizer='rmsprop',
loss='binary_crossentropy',
metrics=['accuracy'])
9.5 训练和评估模型
编译模型并进行训练,然后评估模型在测试集上的性能:
model.fit(x_train, y_train, epochs=4, batch_size=512)
test_loss, test_acc = model.evaluate(x_test, y_test)
print(f"测试集损失: {test_loss}, 测试集准确率: {test_acc}")
10. 调整深度学习模型
深度学习模型的性能通常需要通过调整超参数来优化。以下是一些常见的调整方法:
- 调整网络结构 :增加或减少层的数量、神经元的数量等。
- 调整超参数 :如学习率、批量大小、训练轮数等。
- 使用正则化技术 :如L1和L2正则化、Dropout等。
调整模型的一般流程如下:
1. 确定要调整的超参数。
2. 设计超参数的取值范围。
3. 使用验证集进行不同超参数组合的实验。
4. 选择性能最佳的超参数组合。
11. 在ImageNet上预训练的卷积网络模型
在大规模的ImageNet数据集上预训练的卷积网络模型可以作为计算机视觉应用的基础。这些预训练模型已经学习到了丰富的图像特征,可以通过迁移学习应用到新的任务中。
11.1 预训练模型的优势
- 节省训练时间 :无需从头开始训练模型。
- 提高性能 :利用预训练模型学习到的特征,在小数据集上也能取得较好的效果。
11.2 常见的预训练模型
Keras中常见的预训练模型有VGG16、ResNet、Inception等。可以通过以下代码加载预训练模型:
from tensorflow.keras.applications.vgg16 import VGG16
model = VGG16(weights='imagenet')
12. 总结
深度学习是一个强大且令人兴奋的领域,在众多应用中取得了显著成果。通过Keras和TensorFlow等工具,我们可以方便地构建、训练和调整深度学习模型。本文介绍了深度学习的基本概念、神经网络的原理、常见的数据集以及模型的训练和评估方法。同时,还介绍了如何使用TensorBoard进行可视化、如何调整模型以提高性能以及预训练模型的应用等内容。希望这些内容能帮助你更好地理解和应用深度学习。
超级会员免费看
1292

被折叠的 条评论
为什么被折叠?



