Deep learning with Python 学习笔记(11)

总结

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

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

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

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

<b>深度学习中最多见的三种网络架构:</b> 密集链接网络、卷积网络和循环网络机器学习

对于不一样的数据进行处理时,咱们应该使用不一样的架构,如下为输入模式与适当的网络架构之间的对应关系
<b>向量数据:</b>密集链接网络(Dense 层)
<b>图像数据:</b>二维卷积神经网络
<b>声音数据(好比波形):</b>一维卷积神经网络(首选)或循环神经网络
<b>文本数据:</b>一维卷积神经网络(首选)或循环神经网络
<b>时间序列数据:</b>循环神经网络(首选)或一维卷积神经网络
<b>其余类型的序列数据:</b>循环神经网络或一维卷积神经网络。若是数据顺序很是重要(好比时间序列,但文本不是),那么首选循环神经网络
<b>视频数据:</b>三维卷积神经网络(若是你须要捕捉运动效果),或者帧级的二维神经网络(用于特征提取)+ 循环神经网络或一维卷积神经网络(用于处理获得的序列)
<b>立体数据:</b>三维卷积神经网络模块化

<b>三种网络架构的特色</b>函数

<b><i>1. 密集链接网络</i></b>学习

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

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

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

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

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

<b><i>2. 卷积神经网络</i></b>

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

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

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

例子

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

<b><i>3. 循环神经网络</i></b>

循环神经网络(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)

相关文章
相关标签/搜索