Keras的顺序模型

Keras的顺序模型,第1张

什么是Keras的顺序模型(Sequential Model)?

在创建Keras的层,若没有指定Keras.Input,则在创建层时,不会有权重,因为还不知道输入的形状。例如:

一旦确认了输入的形状,Keras的层的权重会得到初始化,例如:

keras模型的权重,也是在第一次能确认输入张量形状时,才创建。一旦模型创建,便可以调用model.summary()来获得模型结构的描述性输出

在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中,双向循环神经网络,无论是普通的RNN还是LSTM还是GRU,都没有直接定义的层函数。需要另外先导入一个双向结构Bidirectional,并且不能直接从keras.layers导入,直接导入会报错(说起来都是辛酸泪),正确的导入方法如下:

其中参数layer就是RNN的类型,可以使简单的SimpleRNN , LSTM , 或者是GRU等等。merge_mode = ‘ concat’表示最后前向的输出和后向输出的连接方式,concat表示直接连接,类似于列表直接加上去的那种。

  和普通LSTM的输入类似,input还是为【batch_size,time_step,num】其中num表示单个时间点上向量的长度,此处搭建的双向LSTM模型的隐藏层的向量维度为5,输入的向量维度为4,每一个时间点都返回一个维度为【batch_size,5】的结果,最后的输出的连接方式为直接像列表那样堆叠。其中400个参数怎么来的:

  前向循环过程中,输入层和循环层之间之间的权重 其维度为 ,因为这里集成了单个LSTM的3个门控结构和一个输入单元状态的权重,在前向计算的时候,每个时间点的权重是复用的,即不同时间点输入和循环层的权重都是一样的(但前向和后向计算时权重不能复用),具体解释详见: keras中LSTM流程的验证 ,前向计算过程中,循环成之间的权重 ,其权重维度为 ,因为隐藏层的向量维度为5,所以,权重为5*20,其也是将3个门控结构和单元状态都集成在了一个权重参数中,最后加上偏置 ,也是集成了3个门控结构和输入单元状态的参数。

  反向循环过程中,输入层和反向循环层之间的权重 ,其维度和前向循环的维度一样,都为 ,反向循环层之间的权重和前向循环层维度一样 【这里说的只是维度,但数据不同,反向循环不能复用前向循环的参数】,偏置长度也为 。所以整个参数的个数为: 。

前向计算结果一致

结果一致,整个双向LSTM验证通过,存储和计算的流程验证和我想象中的一样。


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

原文地址: http://outofmemory.cn/tougao/12014588.html

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

发表评论

登录后才能评论

评论列表(0条)

保存