畅游人工智能之海--Keras教程之Keras的知识结构

畅游人工智能之海--Keras教程之Keras的知识结构

作者:pandaww

相信大家经过之前几篇文章的学习,已经对人工智能以及它和Keras的关系有了基本的认识,那么我们即将正式开始对于Keras的学习。

Keras是非常优秀的神经网络框架,他提供简单的API的同时也不失灵活性,适合多层次人群的使用,被工业界和学术界广泛采用。对于一个神经网络来说,最顶端也就是最宏观的表现就是他的整体架构,即网络层是以什么方式组成的,是线性组成还是一个较复杂的无环图?是单个输入输出还是多个输入输出?再往深层次看就是它具体的网络层有哪些。在训练数据之前我们需要对数据进行预处理,还要选取适当的loss函数以及优化器。训练之后我们还要选取适当的评估标准来评价模型。当然,在这之间还有很多类型的函数需要选取,比如激活函数、回调函数等等。今天我们就要自上而下地说明Keras的知识结构,也就是按照模型(整体架构)->网络层->数据预处理->其他(各种函数、数据集等)这个顺序来进行简略说明,今天提到的各种API、网络层等等会在之后的文章中依据例子详细说明。有了清晰的知识结构之后,大家学习起来会事半功倍,并且对于知识的掌握会更加牢靠。那么我们就开始吧!

模型

Sequential顺序模型

顺序模型就是多个网络层的线性堆叠。多个网络层顺序执行,进行网络的训练和参数的优化调整。通过Sequential顺序模型API来完成训练、预测、评估等功能。

Model类模型(使用Keras函数式API)

Keras函数式API是定义复杂模型(如多输出模型、有向无环图、或具有共享层的模型)的方法。

要明确三点:①网络层的实例是可调用的,它以张量为参量,并返回一个张量;②输入和输出均为张量,它们都可以用来定义一个模型(Model);③这样的模型可被训练。

根据以上三点就可以知道使用Keras函数式API便可定义出复杂的网络模型。

Model类模型API与Sequential的API相同。

网络层

核心网络层

核心网络层包括一些对于构建神经网络非常重要的层,如Dense层,它将输入的特征表示整合到一起,输出为一个值。可以大大减少特征位置对分类带来的影响;还有Activation层,它将激活函数应用于输出;还有Dropout层,它在每次更新时随机丢弃一部分输入,有助于防止过拟合。此外还有Flatten、Reshape、Lambda层等等核心网络层。

卷积层

卷积层包含Conv1D、Conv2D、SeparableConv1D、DepthwiseConv2D等等卷积网络层。卷积层负责对输入数据进行特征提取,不同的卷积层提取不同的特征,使神经网络对于数据的每个特征都进行局部感知。

池化层

池化层包含各种最大池化网络层和平均池化网络层。可以用于进行下采样降维,压缩特征,去除冗余信息,简化网络复杂度,减小计算量。

局部连接层

局部连接层与卷积层工作方式相同,除了权值不共享之外,它在输入的每个不同部分应用不同的一组过滤器。分为1D和2D类。

循环层

该层主要包含RNN和LSTM相关的类。RNN是循环神经网络基类,LSTM是长短期记忆网络层。具体在后面的文章中会讲解。

嵌入层

嵌入层Embedding将正整数(索引值)转换为固定尺寸的稠密向量。例如[[4], [20]] -> [[0.25, 0.1], [0.6, -0.2]],该层只能用做模型中的第一层。

合并层

合并层的作用是将多个网络层的输出合并在一起形成一个输出。如Add层计算输入张量列表的和、Subtract计算两个输入张量的差、Concatenate连接一个输入张量的列表等等。

高级激活层

高级激活层中有一些更复杂的激活操作,如LeakyReLU为带泄露的ReLU,当神经元未激活时,他仍允许赋予一个很小的梯度、PReLU为参数化的ReLU,其中带有可学习的数组等等。

标准化层

标准化层有BatchNormalization层,它在每一个批次的数据中标准化前一层的激活项, 即,应用一个维持激活项平均值接近 0,标准差接近 1 的转换。

噪声层

噪声层有GaussianNoise、GaussianDropout和AlphaDropout,可以有效缓解过拟合现象,前两个是正则化层,只在训练时才被激活。

层封装器

层封装器有两个。TimeDistributed可以将一个层单独应用于一系列时间步的每一步,输入至少为3D,且第一个维度应该是时间所表示的维度;Bidirectional是RNN的双向封装器,可以对序列进行前向和后向计算。

自定义层

对于无状态的自定义操作,使用Lambda层(在核心网络层中)即可,然而想要包含可训练权重的自定义层,需要实现三个方法:①build中定义权重;②call中编写层的功能逻辑;③compute_output_shape中定义张量形状变化。经过这三步操作即可实现包含可训练权重的自定义层。

数据预处理

序列预处理

Keras提供了多种进行序列预处理的方法:如TimeseriesGenerator用于生成批量时序数据、pad_sequences将多个序列截断或补齐为相同长度、make_sampling_table生成一个基于单词的概率采样表等等。

文本预处理

Keras提供了多种方法对文本数据进行预处理:如Tokenizer是文本标记实用类,允许两种方法向量化一个文本语料库、hashing_trick将文本转换为固定大小散列空间中的索引序列、one_hot将文本编码为大小为n的单词索引列表等等。

图像预处理

运用ImageDataGenerator类对图像进行预处理,通过实时数据增强生成张量图像数据批次。数据将不断循环(按批次)。ImageDataGenerator类有许多方法可以使用,如apply_transform对图像进行变换处理、flow采集数据和标签数组,生成批量增强数据等等。

其他

损失函数Losses

损失函数是编译Keras模型的所需的两个关键参数之一。它是用来优化参数的依据,优化的目的就是使loss尽可能降低,实际的优化目标是所有数据点的输出数组的平均值。常用的loss函数有mean_squared_error、mean_absolute_error等等。

评估标准Metrics

评价函数用于评估当前训练模型的性能,当模型编译(compile)后,评价函数应该作为metrics的参数来输入。可用的评价函数有binary_accuracy、categorical_accuracy等等。

优化器Optimizers

优化器是用来优化网络层权重以使loss尽量降低的工具。它是编译Keras模型的所需的两个关键参数之一。常用的优化器有SGD(随机梯度下降优化器)、Adam优化器等等。

激活函数Activations

激活函数可以通过设置单独的激活层实现,也可以在构造层对象时通过传递 activation参数实现,以避免神经网络仅仅是线性运算。常用的激活函数有softmax、relu等等。

回调函数Callbacks

回调函数是一个函数的合集,会在训练的阶段中所使用。你可以使用回调函数来查看训练模型的内在状态和统计。可以传递一个回调函数的列表到模型的fit方法,相应的回调函数就会被在各自阶段被调用。

初始化Initializers

初始化定义了设置 Keras 各层权重随机初始值的方法。用来将初始化器传入 Keras 层的参数名取决于具体的层。

正则化Regularizers

正则化器允许在优化过程中对层的参数或层的激活情况进行惩罚。 网络优化的损失函数也包括这些惩罚项。惩罚是以层为对象进行的。具体的 API 因层而异。

约束Constraints

constraints模块的函数允许在优化期间对网络参数设置约束(如非负性),以层为对象进行,具体的API因层而异。

可视化Visualization

Keras提供了一些可视化的功能,可以通过plot_model绘制模型的图像并保存,也可以通过Keras的Model上fit方法返回的History对象将训练历史进行可视化。

Scikit-Learn API的封装器

可以使用Keras的Sequential模型(限单一输入)作为Scikit-Learn 工作流程的一部分,有两个封装器可用,一个实现分类器接口,一个实现回归接口。

常用数据集Datasets

常用的数据集有CIFAR10小图像分类数据集、CIFAR100小图像分类数据集、IMDB电影评论情感分类数据集、路透社新闻主题分类、MNIST手写字符数据集、Fashion-MNIST时尚物品数据集、Boston房价回归数据集。

应用Applications

Keras的应用模块提供了带有预训练权值的深度学习模型,这些模型可以用来进行预测、特征提取和微调,可用的模型有(在ImageNet上预训练过的用于图像分类的模型)Xception、VGG16、ResNet、InceptionV3等等。

后端Backend

Keras有三个后端实现可用:TensorFlow后端、Theano后端和CNTK后端。可以在Keras的配置文件中切换后端。

以上便是Keras的知识结构,相信大家经过这篇文章的学习,会对Keras的学习过程有了大致的思路,更有利于之后分模块深层次地学习Keras,让我们一起期待后面的文章吧!