46、深度学习入门:从理论到实践

深度学习入门:从理论到实践

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进行可视化、如何调整模型以提高性能以及预训练模型的应用等内容。希望这些内容能帮助你更好地理解和应用深度学习。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值