Keras中基础知识

Keras中基础知识,第1张

在Keras中设定了两类深度学习模型: 一类是序列模型(Sequential类) ; 一类是通用模型(Model类) 。 其差异在于不同的拓扑结构。

序列模型属于通用模型的一个子类, 因为很常见, 所以这里单独列出来进行介绍。 这种模型

各层之间是依次顺序的线性关系, 在第k层和第k+1层之间可以加上各种元素来构造神经网络。

通用模型可以用来设计非常复杂、 任意拓扑结构的神经网络, 例如有向无环网络、 共享层网络等。

Keras中的重要对象

常用的激活函数、 参数初始化方法、 正则化方法等。

在Keras中使用激活对象有两种方法: 一是单独定义一个激活层; 二是在前置层里面通过激活选项来定义所需的激活函数。

1、model.add(Dense(64,input)_shape=(784,))

model.add(Activation('tanh'))

2、model.add(Dense(64,input_shape=(784,),activation='tanh'))

初始化对象

初始化对象(Initializer) 用于随机设定网络层激活函数中的权重值或者偏置项的初始值, 包括kernel_initializer和bias_initializer。

正则化对象

在神经网络中也提供了正则化的手段, 分别应用于权重参数、 偏置项以及激活函数, 对应的选项分别是kernel_regularizer、bias_reuglarizier和activity_regularizer。

Keras中的网络层构造

核心层(Core Layer) 是构成神经网络最常用的网络层的集合, 包括: 全连接层、 激活层、放弃层、 扁平化层、 重构层、 排列层、 向量反复层、 Lambda层、 激活值正则化层、 掩盖层。 所有的层都包含一个输入端和一个输出端, 中间包含激活函数以及其他相关参数等.

全连接层。 在神经网络中最常见的网络层就是全连接层, 在这个层中实现对神经网络里面的神经元的激活

激活层。 激活层是对上一层的输出应用激活函数的网络层, 这是除应用activation选项之外, 另一种指定激活函数的方式。 其用法很简单, 只要在参数中指明所需的激活函数即可.

放弃层。 放弃层(Dropout) 是对该层的输入向量应用放弃策略。 在模型训练更新参数的步骤中, 网络的某些隐含层节点按照一定比例随机设置为不更新状态, 但是权重仍然保留, 从而防止过度拟合。

扁平化层。 扁化层(Flatten) 是将一个维度大于或等于3的高维矩阵按照设定“压扁”为一个二维的低维矩阵。其压缩方法是保留第一个维度的大小, 然后将所有剩下的数据压缩到第二个维度中, 因此第二个维度的大小是原矩阵第二个维度之后所有维度大小的乘积。 这里第一个维度通常是每次迭代所需的小批量样本数量, 而压缩后的第二个维度就是表达原图像所需的向量长度。

重构层。 重构层(Reshape) 的功能和Numpy的Reshape方法一样, 将一定维度的多维矩阵重新排列构造为一个新的保持同样元素数量但是不同维度尺寸的矩阵。 其参数为一个元组(tuple) , 指定输出向量的维度尺寸, 最终的向量输出维度的第一个维度的尺寸是数据批量的大小, 从第二个维度开始指定输出向量的维度大小。

排列层。 排列层(Permute) 按照给定的模式来排列输入向量的维度。 这个方法在连接卷积网络和时间递归网络的时候非常有用。 其参数是输入矩阵的维度编号在输出矩阵中的位置。

向量反复层。 顾名思义, 向量反复层就是将输入矩阵重复多次。

model.add(Dense(64,input_dim=(784,)))

model.add(RepeatVector(3))

在第一句中, 全连接层的输入矩阵是一个有784个元素的向量, 输出向量是一个维度为(one, 64) 的矩阵; 而第二句将该矩阵反复3次, 从而变成维度为(None, 3, 64) 的多维矩阵, 反复的次数构成第二个维度, 第一个维度永远是数据批量的大小。

Lambda层。 Lambda层可以将任意表达式包装成一个网络层对象。 参数就是表达式, 一般是一个函数, 可以是一个自定义函数, 也可以是任意已有的函数。

激活值正则化层。 这个网络层的作用是对输入的损失函数更新正则化。

掩盖层。 该网络层主要使用在跟时间有关的模型中, 比如LSTM。 其作用是输入张量的时间步, 在给定位置使用指定的数值进行“屏蔽”, 用以定位需要跳过的时间步。

卷积层

卷积 *** 作分为一维、 二维和三维, 对应的方法分别是Conv1D、 Conv2D和Conv3D。

Conv1D、 Conv2D和Conv3D的选项几乎相同。

filters: 卷积滤子输出的维度, 要求整数。

kernel_size: 卷积核的空域或时域窗长度。要求是整数或整数的列表, 或者是元组。 如果是单一整数, 则应用于所有适用的维度。

strides: 卷积在宽或者高维度的步长。 要求是整数或整数的列表, 或者是元组。 如果是单一整数, 则应用于所有适用的维度。 如果设定步长不为1, 则dilation_rate选项的取值必须为1。

padding: 补齐策略, 取值为valid、 same或causal。 causal将产生因果(膨胀的) 卷积,即output[t]不依赖于input[t+1: ], 在不能违反时间顺序的时序信号建模时有用。 valid代表只进行有效的卷积, 即对边界数据不处理。 same代表保留边界处的卷积结果, 通常会导致输出shape与输入shape相同。

data_format: 数据格式, 取值为channels_last或者channels_first。 这个选项决定了数据维

度次序, 其中channels_last对应的数据维度次序是(批量数, 高, 宽, 频道数) , 而channels_first对应的数据维度次序为(批量数, 频道数, 高, 宽) 。

activation: 激活函数, 为预定义或者自定义的激活函数名

dilation_rate: 该选项指定扩张卷积(DilatedConvolution) 中的扩张比例。 要求为整数或由单个整数构成的列表/元组, 如果dilation_rate不为1, 则步长一项必须设为1。

use_bias: 指定是否使用偏置项, 取值为True或者False。

kernel_initializer: 权重初始化方法, 为预定义初始化方法名的字符串, 或用于初始化权重的函数.

bias_initializer: 偏置初始化方法, 为预定义初始化方法名的字符串, 或用于初始化偏置的函数。

kernel_regularizer: 施加在权重上的正则项.

bias_regularizer: 施加在偏置项上的正则项.

activity_regularizer: 施加在输出上的正则项.

kernel_constraints: 施加在权重上的约束项

bias_constraints: 施加在偏置项上的约束项

池化层

池化(Pooling) 是在卷积神经网络中对图像特征的一种处理, 通常在卷积 *** 作之后进行。 池

化的目的是为了计算特征在局部的充分统计量,从而降低总体的特征数量, 防止过度拟合和减少

计算量。 举例说明: 假设有一个128×128的图像, 以8×8的网格做卷积, 那么一个卷积 *** 作一

共可以得到(128-8+1) 2个维度的输出向量, 如果有70个不同的特征进行卷积 *** 作, 那么总体的

特征数量可以达到70×(128-8+1) 2=1024870个。用100万个特征做机器学习, 除非数据量极大,否则很容易发生过度拟合。

循环层

循环层(Recurrent Layer) 用来构造跟序列有关的神经网络。 但是其本身是一个抽象类, 无法

实例化对象, 在使用时应该使用LSTM, GRU和SimpleRNN三个子类来构造网络层。

嵌入层

嵌入层(Embedding Layer) 是使用在模型第一层的一个网络层, 其目的是将所有索引标号映射到致密的低维向量中.通常用在对文本数据进行建模的时候。

合并层

合并层是指将多个网络产生的张量通过一定方法合并在一起, 合并层支持不同的合并方法, 包括:

元素相加(merge.Add) 、 元素相乘

(merge.Multiply) 、 元素取平均

(merge.Average) 、 元素取最大

(merge.Maximum) 、 叠加

(merge.Concatenate) 、 矩阵相乘

(merge.Dot) 。

用Keras搭建神经网络的步骤:

深度学习框架Keras——像搭积木般构建神经网络,主要分为7个部分,每个部分只需要几个keras API函数就能实现,用户即可像搭积木般一层层构建神经网络模型。

1. 创建模型 Create model

2. 添加层级 Add Layer

3. 模型编译 Compile

4. 数据填充 Fit

5. 模型评估 Evaluate

6. 模型预测 Predict

7. 模型保存 Save model

下面章节会对每一部分具体来介绍。。。

Keras 中主要有三类模型:Sequential model, Functional model, Subclass model

在开始创建模型之前,首先需要引入tensorflow和keras模块,然后再创建一个Sequential model

Sequential API定义如下:

layers参数可以为空, 然后通过add method向模型中添加layer,相对应的通过pop method移除模型中layer。

创建Function API模型,可以调用Keras.Model来指定多输入多数出。

Keras.Model定义:

Layers是神经网络基本构建块。一个Layer包含了tensor-in/tensor-out的计算方法和一些状态,并保存在TensorFlow变量中(即layers的权重weights)。

Layers主要分为6个类别,基础层,核心层,卷基层,池化层,循环层,融合层。

对派生类的实现可以用以下方法:

** init (): 定义layer的属性,创建layer的静态变量。

** build(self, input_shape): 创建依赖于输入的变量,可以调用add_weight()。

** call(self, *args, **kwargs): 在确保已调用build()之后,在 call 中调用。

** get_config(self): 返回包含用于初始化此层的配置的字典类型。

创建SimpleDense派生类,在build()函数里添加trainable weights。实现y=input*w +b

结果输出:

创建ComputeSum派生类,在 init 函数里添加 non-trainable weights。实现输入矩阵沿轴0元素相加后,x=x+self.total

结果输出:

核心层是最常用的层,涉及到数据的转换和处理的时候都会用到这些层。

Dense层就是所谓的全连接神经网络层,简称全连接层。全连接层中的每个神经元与其前一层的所有神经元进行全连接。

Dense 实现以下 *** 作: output = activation(dot(input, kernel) + bias) 其中 activation 是按逐个元素计算的激活函数,kernel 是由网络层创建的权值矩阵,以及 bias 是其创建的偏置向量 (只在 use_bias 为 True 时才有用)。

将激活函数应用于输出。输入信号进入神经元后进行的运算处理。

sigmoid、tanh、ReLU、softplus的对比曲线如下图所示:

激活函数可以通过设置单独的激活层Activation实现,也可以在构造层对象时通过传递 activation 参数实现:

Dropout在训练中每次更新时,将输入单元的按比率随机设置为0,这有助于防止过拟合。未设置为0的输入将按1 /(1-rate)放大,以使所有输入的总和不变。

请注意,仅当训练设置为True时才应用Dropout层,以便在推理过程中不会丢弃任何值。 使用model.fit时,训练将自动适当地设置为True。

将输入展平。不影响批量大小。注意:如果输入的形状是(batch,)没有特征轴,则展平会增加通道尺寸,而输出的形状是(batch, 1)。

将输入重新调整为特定的尺寸

将任意表达式封装为Layer对象。在Lambda层,以便在构造模型时可以使用任意TensorFlow函数。 Lambda层最适合简单 *** 作或快速实验。 Lambda层是通过序列化Python字节码来保存的。

使用覆盖值覆盖序列,以跳过时间步。

对于输入张量的每一个时间步(张量的第一个维度),如果所有时间步中输入张量的值与mask_value相等,则将在所有下游层中屏蔽(跳过)该时间步。如果任何下游层不支持覆盖但仍然收到此类输入覆盖信息,会引发异常。

举例说明:

Embedding 是一个将离散变量转为连续向量表示的一个方式。该层只能用作模型中的第一层。

Embedding 有以下3个主要目的: 在 embedding 空间中查找最近邻,这可以很好的用于根据用户的兴趣来进行推荐。 作为监督性学习任务的输入。 用于可视化不同离散变量之间的关系.

举例说明:

输出结果:

由维基百科的介绍我们可以得知,卷积是一种定义在两个函数(

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/7857454.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-10
下一篇2023-04-10

发表评论

登录后才能评论

评论列表(0条)

    保存