总结

机器学习(machine learning)是人工智能的一个特殊子领域,其目标是仅靠观察训练数据来自动开发程序[即模型(model)]。将数据转换为程序的这个过程叫作学习(learning)

深度学习(deep learning)是机器学习的众多分支之一,它的模型是一长串几何函数,一个接一个地作用在数据上。这些运算被组织成模块,叫作层(layer)。深度学习模型通常都是层的堆叠,或者更通俗地说,是层组成的图。这些层由权重(weight)来参数化,权重是在训练过程中需要学习的参数。模型的知识(knowledge)保存在它的权重中,学习的过程就是为这些权重找到正确的值

在深度学习中,一切都是向量,即一切都是几何空间(geometric space)中的点(point)。在开始学习之前,我们首先需要将模型输入(文本、图像等)和目标向量化(vectorize),即将其转换为初始输入向量空间和目标向量空间。深度学习模型的每一层都对通过它的数据做一个简单的几何变换。模型中的层链共同形成了一个非常复杂的几何变换,它可以分解为一系列简单的几何变换。这个复杂变换试图将输入空间映射到目标空间,每次映射一个点。这个变换由层的权重来参数化,权重根据模型当前表现进行迭代更新。这种几何变换有一个关键性质,就是它必须是可微的(differentiable),这样我们才能通过梯度下降来学习其参数。直观上来看,这意味着从输入到输出的几何变形必须是平滑且连续的,这是一个很重要的约束条件

深度学习整件事情完全取决于一个核心思想:意义来自于事物之间的成对关系(一门语言的单词之间,一张图像的像素之间等),而这些关系可以用距离函数来表示

深度学习中最常见的三种网络架构: 密集连接网络、卷积网络和循环网络

对于不同的数据进行处理时,我们应该使用不同的架构,以下为输入模式与适当的网络架构之间的对应关系

向量数据:密集连接网络(Dense 层)

图像数据:二维卷积神经网络

声音数据(比如波形):一维卷积神经网络(首选)或循环神经网络

文本数据:一维卷积神经网络(首选)或循环神经网络

时间序列数据:循环神经网络(首选)或一维卷积神经网络

其他类型的序列数据:循环神经网络或一维卷积神经网络。如果数据顺序非常重要(比如时间序列,但文本不是),那么首选循环神经网络

视频数据:三维卷积神经网络(如果你需要捕捉运动效果),或者帧级的二维神经网络(用于特征提取)+ 循环神经网络或一维卷积神经网络(用于处理得到的序列)

立体数据:三维卷积神经网络

三种网络架构的特点

1. 密集连接网络

密集连接网络是 Dense 层的堆叠,它用于处理向量数据(向量批量)。这种网络假设输入特征中没有特定结构:之所以叫作密集连接,是因为 Dense 层的每个单元都和其他所有单元相连接。这种层试图映射任意两个输入特征之间的关系,它与二维卷积层不同,后者仅查看局部关系

密集连接网络最常用于分类数据(比如输入特征是属性的列表),还用于大多数网络最终分类或回归的阶段。对于二分类问题(binary classification),层堆叠的最后一层是使用 sigmoid 激活且只有一个单元的 Dense 层,并使用 binary_crossentropy 作为损失。目标应该是 0 或 1

对于单标签多分类问题(single-label categorical classification,每个样本只有一个类别,不会超过一个),层堆叠的最后一层是一个 Dense 层,它使用 softmax 激活,其单元个数等于类别个数。如果目标是 one-hot 编码的,那么使用 categorical_crossentropy 作为损失;如果目标是整数,那么使用 sparse_categorical_crossentropy 作为损失

对于多标签多分类问题(multilabel categorical classification,每个样本可以有多个类别),层堆叠的最后一层是一个 Dense 层,它使用 sigmoid 激活,其单元个数等于类别个数,并使用 binary_crossentropy 作为损失。目标应该是 k-hot 编码的

对于连续值向量的回归(regression)问题,层堆叠的最后一层是一个不带激活 Dense 层,其单元个数等于你要预测的值的个数。有几种损失可用于回归问题,最常见的是 mean_squared_error(均方误差,MSE)和 mean_absolute_error(平均绝对误差,MAE)

2. 卷积神经网络

卷积层能够查看空间局部模式,其方法是对输入张量的不同空间位置(图块)应用相同的几何变换。这样得到的表示具有平移不变性,这使得卷积层能够高效利用数据,并且能够高度模块化。这个想法适用于任何维度的空间,包括一维(序列)、二维(图像)、三维(立体数据)等。你可以使用 Conv1D 层来处理序列(特别是文本,它对时间序列的效果并不好,因为时间序列通常不满足平移不变的假设),使用 Conv2D 层来处理图像,使用 Conv3D 层来处理立体数据

卷积神经网络或卷积网络是卷积层和最大池化层的堆叠。池化层可以对数据进行空间下采样,这么做有两个目的:随着特征数量的增大,我们需要让特征图的尺寸保持在合理范围内;让后面的卷积层能够“看到”输入中更大的空间范围。卷积神经网络的最后通常是一个 Flatten 运算或全局池化层,将空间特征图转换为向量,然后再是 Dense 层,用于实现分类或回归

大部分(或者全部)普通卷积很可能不久后会被深度可分离卷积(depthwise separable convolution,SeparableConv2D 层)所替代,后者与前者等效,但速度更快、表示效率更高。对于三维、二维和一维的输入来说都是如此

例子

model.add(layers.SeparableConv2D(64, 3, activation='relu'))

3. 循环神经网络

循环神经网络(RNN,recurrent neural network)的工作原理是,对输入序列每次处理一个时间步,并且自始至终保存一个状态(state,这个状态通常是一个向量或一组向量,即状态几何空间中的点)。如果序列中的模式不具有时间平移不变性(比如时间序列数据,最近的过去比遥远的过去更加重要),那么应该优先使用循环神经网络,而不是一维卷积神经网络

Keras 中有三种 RNN 层:SimpleRNN、GRU 和 LSTM。对于大多数实际用途,你应该使用GRU 或 LSTM。两者中 LSTM 更加强大,计算代价也更高。你可以将 GRU 看作是一种更简单、计算代价更小的替代方法

想要将多个 RNN 层逐个堆叠在一起,最后一层之前的每一层都应该返回输出的完整序列(每个输入时间步都对应一个输出时间步)。如果你不再堆叠更多的 RNN 层,那么通常只返回最后一个输出,其中包含关于整个序列的信息

返回与不返回的差别

# 不返回
model.add(layers.LSTM(32, input_shape=(num_timesteps, num_features)))
# 返回
model.add(layers.LSTM(32, return_sequences=True, input_shape=(num_timesteps, num_features)))

全书学习完

Deep learning with Python 学习笔记(10)

Deep learning with Python 学习笔记(11)的更多相关文章

  1. Deep learning with Python 学习笔记(10)

    生成式深度学习 机器学习模型能够对图像.音乐和故事的统计潜在空间(latent space)进行学习,然后从这个空间中采样(sample),创造出与模型在训练数据中所见到的艺术作品具有相似特征的新作品 ...

  2. Deep learning with Python 学习笔记(9)

    神经网络模型的优化 使用 Keras 回调函数 使用 model.fit()或 model.fit_generator() 在一个大型数据集上启动数十轮的训练,有点类似于扔一架纸飞机,一开始给它一点推 ...

  3. Deep learning with Python 学习笔记(8)

    Keras 函数式编程 利用 Keras 函数式 API,你可以构建类图(graph-like)模型.在不同的输入之间共享某一层,并且还可以像使用 Python 函数一样使用 Keras 模型.Ker ...

  4. Deep learning with Python 学习笔记(7)

    介绍一维卷积神经网络 卷积神经网络能够进行卷积运算,从局部输入图块中提取特征,并能够将表示模块化,同时可以高效地利用数据.这些性质让卷积神经网络在计算机视觉领域表现优异,同样也让它对序列处理特别有效. ...

  5. Deep learning with Python 学习笔记(6)

    本节介绍循环神经网络及其优化 循环神经网络(RNN,recurrent neural network)处理序列的方式是,遍历所有序列元素,并保存一个状态(state),其中包含与已查看内容相关的信息. ...

  6. Deep learning with Python 学习笔记(5)

    本节讲深度学习用于文本和序列 用于处理序列的两种基本的深度学习算法分别是循环神经网络(recurrent neural network)和一维卷积神经网络(1D convnet) 与其他所有神经网络一 ...

  7. Deep learning with Python 学习笔记(4)

    本节讲卷积神经网络的可视化 三种方法 可视化卷积神经网络的中间输出(中间激活) 有助于理解卷积神经网络连续的层如何对输入进行变换,也有助于初步了解卷积神经网络每个过滤器的含义 可视化卷积神经网络的过滤 ...

  8. Deep learning with Python 学习笔记(3)

    本节介绍基于Keras的使用预训练模型方法 想要将深度学习应用于小型图像数据集,一种常用且非常高效的方法是使用预训练网络.预训练网络(pretrained network)是一个保存好的网络,之前已在 ...

  9. Deep learning with Python 学习笔记(2)

    本节介绍基于Keras的CNN 卷积神经网络接收形状为 (image_height, image_width, image_channels)的输入张量(不包括批量维度),宽度和高度两个维度的尺寸通常 ...

随机推荐

  1. WindowsPE权威指南 第二章 小工具 pedump代码的C语言实现

    2016-11-16 16:29:07 主程序代码 pedump.c #include <windows.h> #include <Richedit.h> #include & ...

  2. SpringMVC对静态资源的访问(js、css、img)

    在网上找了很多的内容,都没法解决,最后通过https://blog.csdn.net/wild46cat/article/details/52456715中内容解决的,在此记录一下. 项目结构: po ...

  3. eclipse中opencv配置

    1.打开Eclipse,Window->preferences 2.进入preferences后,找到Java->Build Path->User Libraries,点击New 在 ...

  4. vb.net WIN32API 获取listview的值

    Public Class Form1 Public Const LVM_FIRST As Short = &H1000S Public Const LVM_GETITEMCOUNT As In ...

  5. lombok学习

    lombok的官方地址:https://projectlombok.org/ lombok的Github地址:https://github.com/rzwitserloot/lombok lombok ...

  6. Windows下 tensorboard出现ValueError:Invalid format string

    Windows下 tensorboard出现ValueError:Invalid format string错误时,是格式错误问题,解决方法参阅我的另一篇博客 https://www.jianshu. ...

  7. linux时区和时间设置

    1,修改时区 调整时区使用tzselect [root@lyn ~]# hwclock Tue Nov :: PM AST -0.198205 seconds [root@lyn ~]# tzsele ...

  8. Codeforces Round #485 (Div. 2) F. AND Graph

    Codeforces Round #485 (Div. 2) F. AND Graph 题目连接: http://codeforces.com/contest/987/problem/F Descri ...

  9. android-读取MediaProvider

    1.MediaProvider存储手机中的媒体文件,用 SQLite 数据库存储图片.视频.音频等多媒体文件的信息,供视频播放器.音乐播放器.图库使用.以 root 权限进入 adb shell,使用 ...

  10. MAC OS 更新GIT版本时遇到的问题

    在更新git版本时,没有备份就删掉了原先的版本,在安装完2.18.0的新版本后,使用命令行git --version,返回错误git not a developer tool or in PATH. ...