keras学习-循环层Recurrent-包装器Wrapper-自己的
循环层Recurrent
Recurrent层
keras.layers.recurrent.Recurrent(return_sequences=False, go_backwards=False, stateful=False, unroll=False, implementation=0)
这是循环层的抽象类,请不要在模型中直接应用该层(因为它是抽象类,无法实例化任何对象)。请使用它的子类LSTM
,GRU
或SimpleRNN
。
所有的循环层(LSTM
,GRU
,SimpleRNN
)都继承本层,因此下面的参数可以在任何循环层中使用。
参数
weights:numpy array的list,用以初始化权重。该list形如
[(input_dim, output_dim),(output_dim, output_dim),(output_dim,)]
return_sequences:布尔值,默认
False
,控制返回类型。若为True
则返回整个序列,否则仅返回输出序列的最后一个输出go_backwards:布尔值,默认为
False
,若为True
,则逆向处理输入序列并返回逆序后的序列stateful:布尔值,默认为
False
,若为True
,则一个batch中下标为i的样本的最终状态将会用作下一个batch同样下标的样本的初始状态。unroll:布尔值,默认为
False
,若为True
,则循环层将被展开,否则就使用符号化的循环。当使用TensorFlow为后端时,循环网络本来就是展开的,因此该层不做任何事情。层展开会占用更多的内存,但会加速RNN的运算。层展开只适用于短序列。implementation:0,1或2, 若为0,则RNN将以更少但是更大的矩阵乘法实现,因此在CPU上运行更快,但消耗更多的内存。如果设为1,则RNN将以更多但更小的矩阵乘法实现,因此在CPU上运行更慢,在GPU上运行更快,并且消耗更少的内存。如果设为2(仅LSTM和GRU可以设为2),则RNN将把输入门、遗忘门和输出门合并为单个矩阵,以获得更加在GPU上更加高效的实现。注意,RNN dropout必须在所有门上共享,并导致正则效果性能微弱降低。
input_dim:输入维度,当使用该层为模型首层时,应指定该值(或等价的指定input_shape)
input_length:当输入序列的长度固定时,该参数为输入序列的长度。当需要在该层后连接
Flatten
层,然后又要连接Dense
层时,需要指定该参数,否则全连接的输出无法计算出来。注意,如果循环层不是网络的第一层,你需要在网络的第一层中指定序列的长度(通过input_shape
指定)。
输入shape
形如(samples,timesteps,input_dim)的3D张量
输出shape
如果return_sequences=True
:返回形如(samples,timesteps,output_dim)的3D张量
否则,返回形如(samples,output_dim)的2D张量
例子
# as the first layer in a Sequential model
model = Sequential()
model.add(LSTM(32, input_shape=(10, 64)))
# now model.output_shape == (None, 32)
# note: `None` is the batch dimension.# the following is identical:
model = Sequential()
model.add(LSTM(32, input_dim=64, input_length=10))# for subsequent layers, no need to specify the input size:model.add(LSTM(16))# to stack recurrent layers, you must use return_sequences=True
# on any recurrent layer that feeds into another recurrent layer.
# note that you only need to specify the input size on the first layer.
model = Sequential()
model.add(LSTM(64, input_dim=64, input_length=10, return_sequences=True))
model.add(LSTM(32, return_sequences=True))
model.add(LSTM(10))
指定RNN初始状态的注意事项
可以通过设置initial_state
用符号式的方式指定RNN层的初始状态。即,initial_stat
的值应该为一个tensor或一个tensor列表,代表RNN层的初始状态。
也可以通过设置reset_states
参数用数值的方法设置RNN的初始状态,状态的值应该为numpy数组或numpy数组的列表,代表RNN层的初始状态。
屏蔽输入数据(Masking)
循环层支持通过时间步变量对输入数据进行Masking,如果想将输入数据的一部分屏蔽掉,请使用Embedding层并将参数mask_zero
设为True
。
使用状态RNN的注意事项
可以将RNN设置为‘stateful’,意味着由每个batch计算出的状态都会被重用于初始化下一个batch的初始状态。状态RNN假设连续的两个batch之中,相同下标的元素有一一映射关系。
要启用状态RNN,请在实例化层对象时指定参数stateful=True
,并在Sequential模型使用固定大小的batch:通过在模型的第一层传入batch_size=(...)
和input_shape
来实现。在函数式模型中,对所有的输入都要指定相同的batch_size
。
如果要将循环层的状态重置,请调用.reset_states()
,对模型调用将重置模型中所有状态RNN的状态。对单个层调用则只重置该层的状态。
SimpleRNN层
keras.layers.GRU(units, activation='tanh', recurrent_activation='hard_sigmoid', use_bias=True, kernel_initializer='glorot_uniform', recurrent_initializer='orthogonal', bias_initializer='zeros', kernel_regularizer=None, recurrent_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, recurrent_constraint=None, bias_constraint=None, dropout=0.0, recurrent_dropout=0.0, implementation=1, return_sequences=False, return_state=False, go_backwards=False, stateful=False, unroll=False)
全连接RNN网络,RNN的输出会被回馈到输入
参数
units:输出维度
activation:激活函数,为预定义的激活函数名(参考激活函数)
use_bias: 布尔值,是否使用偏置项
kernel_initializer:权值初始化方法,为预定义初始化方法名的字符串,或用于初始化权重的初始化器。参考initializers
recurrent_initializer:循环核的初始化方法,为预定义初始化方法名的字符串,或用于初始化权重的初始化器。参考initializers
bias_initializer:权值初始化方法,为预定义初始化方法名的字符串,或用于初始化权重的初始化器。参考initializers
kernel_regularizer:施加在权重上的正则项,为Regularizer对象
bias_regularizer:施加在偏置向量上的正则项,为Regularizer对象
recurrent_regularizer:施加在循环核上的正则项,为Regularizer对象
activity_regularizer:施加在输出上的正则项,为Regularizer对象
kernel_constraints:施加在权重上的约束项,为Constraints对象
recurrent_constraints:施加在循环核上的约束项,为Constraints对象
bias_constraints:施加在偏置上的约束项,为Constraints对象
dropout:0~1之间的浮点数,控制输入线性变换的神经元断开比例
recurrent_dropout:0~1之间的浮点数,控制循环状态的线性变换的神经元断开比例
其他参数参考Recurrent的说明
参考文献
- A Theoretically Grounded Application of Dropout in Recurrent Neural Networks
GRU层
keras.layers.recurrent.GRU(units, activation='tanh', recurrent_activation='hard_sigmoid', use_bias=True, kernel_initializer='glorot_uniform', recurrent_initializer='orthogonal', bias_initializer='zeros', kernel_regularizer=None, recurrent_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, recurrent_constraint=None, bias_constraint=None, dropout=0.0, recurrent_dropout=0.0)
门限循环单元(详见参考文献)
参数
units:输出维度
activation:激活函数,为预定义的激活函数名(参考激活函数)
use_bias: 布尔值,是否使用偏置项
kernel_initializer:权值初始化方法,为预定义初始化方法名的字符串,或用于初始化权重的初始化器。参考initializers
recurrent_initializer:循环核的初始化方法,为预定义初始化方法名的字符串,或用于初始化权重的初始化器。参考initializers
bias_initializer:权值初始化方法,为预定义初始化方法名的字符串,或用于初始化权重的初始化器。参考initializers
kernel_regularizer:施加在权重上的正则项,为Regularizer对象
bias_regularizer:施加在偏置向量上的正则项,为Regularizer对象
recurrent_regularizer:施加在循环核上的正则项,为Regularizer对象
activity_regularizer:施加在输出上的正则项,为Regularizer对象
kernel_constraints:施加在权重上的约束项,为Constraints对象
recurrent_constraints:施加在循环核上的约束项,为Constraints对象
bias_constraints:施加在偏置上的约束项,为Constraints对象
dropout:0~1之间的浮点数,控制输入线性变换的神经元断开比例
recurrent_dropout:0~1之间的浮点数,控制循环状态的线性变换的神经元断开比例
其他参数参考Recurrent的说明
参考文献
On the Properties of Neural Machine Translation: Encoder–Decoder Approaches
Empirical Evaluation of Gated Recurrent Neural Networks on Sequence Modeling
A Theoretically Grounded Application of Dropout in Recurrent Neural Networks
LSTM层
keras.layers.recurrent.LSTM(units, activation='tanh', recurrent_activation='hard_sigmoid', use_bias=True, kernel_initializer='glorot_uniform', recurrent_initializer='orthogonal', bias_initializer='zeros', unit_forget_bias=True, kernel_regularizer=None, recurrent_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, recurrent_constraint=None, bias_constraint=None, dropout=0.0, recurrent_dropout=0.0)
Keras长短期记忆模型,关于此算法的详情,请参考本教程
参数
units:输出维度
activation:激活函数,为预定义的激活函数名(参考激活函数)
recurrent_activation: 为循环步施加的激活函数(参考激活函数)
use_bias: 布尔值,是否使用偏置项
kernel_initializer:权值初始化方法,为预定义初始化方法名的字符串,或用于初始化权重的初始化器。参考initializers
recurrent_initializer:循环核的初始化方法,为预定义初始化方法名的字符串,或用于初始化权重的初始化器。参考initializers
bias_initializer:权值初始化方法,为预定义初始化方法名的字符串,或用于初始化权重的初始化器。参考initializers
kernel_regularizer:施加在权重上的正则项,为Regularizer对象
bias_regularizer:施加在偏置向量上的正则项,为Regularizer对象
recurrent_regularizer:施加在循环核上的正则项,为Regularizer对象
activity_regularizer:施加在输出上的正则项,为Regularizer对象
kernel_constraints:施加在权重上的约束项,为Constraints对象
recurrent_constraints:施加在循环核上的约束项,为Constraints对象
bias_constraints:施加在偏置上的约束项,为Constraints对象
dropout:0~1之间的浮点数,控制输入线性变换的神经元断开比例
recurrent_dropout:0~1之间的浮点数,控制循环状态的线性变换的神经元断开比例
其他参数参考Recurrent的说明
参考文献
Long short-term memory(original 1997 paper)
Learning to forget: Continual prediction with LSTM
Supervised sequence labelling with recurrent neural networks
A Theoretically Grounded Application of Dropout in Recurrent Neural Networks
ConvLSTM2D层
keras.layers.ConvLSTM2D(filters, kernel_size, strides=(1, 1), padding='valid', data_format=None, dilation_rate=(1, 1), activation='tanh', recurrent_activation='hard_sigmoid', use_bias=True, kernel_initializer='glorot_uniform', recurrent_initializer='orthogonal', bias_initializer='zeros', unit_forget_bias=True, kernel_regularizer=None, recurrent_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, recurrent_constraint=None, bias_constraint=None, return_sequences=False, go_backwards=False, stateful=False, dropout=0.0, recurrent_dropout=0.0)
ConvLSTM2D是一个LSTM网络,但它的输入变换和循环变换是通过卷积实现的
参数
- filters: 整数,输出的维度,该参数含义同普通卷积层的filters
- kernel_size: 整数或含有n个整数的tuple/list,指定卷积窗口的大小
- strides: 整数或含有n个整数的tuple/list,指定卷积步长,当不等于1时,无法使用dilation功能,即dialation_rate必须为1.
- padding: "valid" 或 "same" 之一
- data_format: * data_format:字符串,“channels_first”或“channels_last”之一,代表图像的通道维的位置。该参数是Keras 1.x中的image_dim_ordering,“channels_last”对应原本的“tf”,“channels_first”对应原本的“th”。以128x128的RGB图像为例,“channels_first”应将数据组织为(3,128,128),而“channels_last”应将数据组织为(128,128,3)。该参数的默认值是
~/.keras/keras.json
中设置的值,若从未设置过,则为“channels_last”。 - dilation_rate: 单个整数或由两个个整数构成的list/tuple,指定dilated convolution中的膨胀比例。任何不为1的dilation_rate均与任何不为1的strides均不兼容。
- activation: activation:激活函数,为预定义的激活函数名(参考激活函数),或逐元素(element-wise)的Theano函数。如果不指定该参数,将不会使用任何激活函数(即使用线性激活函数:a(x)=x)
- recurrent_activation: 用在recurrent部分的激活函数,为预定义的激活函数名(参考激活函数),或逐元素(element-wise)的Theano函数。如果不指定该参数,将不会使用任何激活函数(即使用线性激活函数:a(x)=x)
- use_bias: Boolean, whether the layer uses a bias vector.
- kernel_initializer:权值初始化方法,为预定义初始化方法名的字符串,或用于初始化权重的初始化器。参考initializers
- recurrent_initializer:循环核的初始化方法,为预定义初始化方法名的字符串,或用于初始化权重的初始化器。参考initializers
- bias_initializer:权值初始化方法,为预定义初始化方法名的字符串,或用于初始化权重的初始化器。参考initializers
- kernel_regularizer:施加在权重上的正则项,为Regularizer对象
- bias_regularizer:施加在偏置向量上的正则项,为Regularizer对象
- recurrent_regularizer:施加在循环核上的正则项,为Regularizer对象
- activity_regularizer:施加在输出上的正则项,为Regularizer对象
- kernel_constraints:施加在权重上的约束项,为Constraints对象
- recurrent_constraints:施加在循环核上的约束项,为Constraints对象
- bias_constraints:施加在偏置上的约束项,为Constraints对象
- dropout:0~1之间的浮点数,控制输入线性变换的神经元断开比例
- recurrent_dropout:0~1之间的浮点数,控制循环状态的线性变换的神经元断开比例
- 其他参数参考Recurrent的说明
输入shape
若data_format='channels_first', 为形如(samples,time, channels, rows, cols)的5D tensor 若data_format='channels_last' 为形如(samples,time, rows, cols, channels)的5D tensor
输出shape
if return_sequences: if data_format='channels_first' :5D tensor (samples, time, filters, output_row, output_col) if data_format='channels_last' :5D tensor (samples, time, output_row, output_col, filters) else if data_format ='channels_first' :4D tensor (samples, filters, output_row, output_col) if data_format='channels_last' :4D tensor (samples, output_row, output_col, filters) (o_row和o_col由filter和padding决定)
参考文献
Convolutional LSTM Network: A Machine Learning Approach for Precipitation Nowcasting * 当前的实现不包含cell输出上的反馈循环(feedback loop)
SimpleRNNCell层
keras.layers.SimpleRNNCell(units, activation='tanh', use_bias=True, kernel_initializer='glorot_uniform', recurrent_initializer='orthogonal', bias_initializer='zeros', kernel_regularizer=None, recurrent_regularizer=None, bias_regularizer=None, kernel_constraint=None, recurrent_constraint=None, bias_constraint=None, dropout=0.0, recurrent_dropout=0.0)
SinpleRNN的Cell类
参数
units:输出维度
activation:激活函数,为预定义的激活函数名(参考激活函数)
use_bias: 布尔值,是否使用偏置项
kernel_initializer:权值初始化方法,为预定义初始化方法名的字符串,或用于初始化权重的初始化器。参考initializers
recurrent_initializer:循环核的初始化方法,为预定义初始化方法名的字符串,或用于初始化权重的初始化器。参考initializers
bias_initializer:权值初始化方法,为预定义初始化方法名的字符串,或用于初始化权重的初始化器。参考initializers
kernel_regularizer:施加在权重上的正则项,为Regularizer对象
bias_regularizer:施加在偏置向量上的正则项,为Regularizer对象
recurrent_regularizer:施加在循环核上的正则项,为Regularizer对象
activity_regularizer:施加在输出上的正则项,为Regularizer对象
kernel_constraints:施加在权重上的约束项,为Constraints对象
recurrent_constraints:施加在循环核上的约束项,为Constraints对象
bias_constraints:施加在偏置上的约束项,为Constraints对象
dropout:0~1之间的浮点数,控制输入线性变换的神经元断开比例
recurrent_dropout:0~1之间的浮点数,控制循环状态的线性变换的神经元断开比例
GRUCell层
keras.layers.GRUCell(units, activation='tanh', recurrent_activation='hard_sigmoid', use_bias=True, kernel_initializer='glorot_uniform', recurrent_initializer='orthogonal', bias_initializer='zeros', kernel_regularizer=None, recurrent_regularizer=None, bias_regularizer=None, kernel_constraint=None, recurrent_constraint=None, bias_constraint=None, dropout=0.0, recurrent_dropout=0.0, implementation=1)
GRU的Cell类
参数
units:输出维度
activation:激活函数,为预定义的激活函数名(参考激活函数)
use_bias: 布尔值,是否使用偏置项
kernel_initializer:权值初始化方法,为预定义初始化方法名的字符串,或用于初始化权重的初始化器。参考initializers
recurrent_initializer:循环核的初始化方法,为预定义初始化方法名的字符串,或用于初始化权重的初始化器。参考initializers
bias_initializer:权值初始化方法,为预定义初始化方法名的字符串,或用于初始化权重的初始化器。参考initializers
kernel_regularizer:施加在权重上的正则项,为Regularizer对象
bias_regularizer:施加在偏置向量上的正则项,为Regularizer对象
recurrent_regularizer:施加在循环核上的正则项,为Regularizer对象
activity_regularizer:施加在输出上的正则项,为Regularizer对象
kernel_constraints:施加在权重上的约束项,为Constraints对象
recurrent_constraints:施加在循环核上的约束项,为Constraints对象
bias_constraints:施加在偏置上的约束项,为Constraints对象
dropout:0~1之间的浮点数,控制输入线性变换的神经元断开比例
recurrent_dropout:0~1之间的浮点数,控制循环状态的线性变换的神经元断开比例
- 其他参数参考Recurrent的说明
LSTMCell层
keras.layers.LSTMCell(units, activation='tanh', recurrent_activation='hard_sigmoid', use_bias=True, kernel_initializer='glorot_uniform', recurrent_initializer='orthogonal', bias_initializer='zeros', unit_forget_bias=True, kernel_regularizer=None, recurrent_regularizer=None, bias_regularizer=None, kernel_constraint=None, recurrent_constraint=None, bias_constraint=None, dropout=0.0, recurrent_dropout=0.0, implementation=1)
LSTM的Cell类
参数
units:输出维度
activation:激活函数,为预定义的激活函数名(参考激活函数)
use_bias: 布尔值,是否使用偏置项
kernel_initializer:权值初始化方法,为预定义初始化方法名的字符串,或用于初始化权重的初始化器。参考initializers
recurrent_initializer:循环核的初始化方法,为预定义初始化方法名的字符串,或用于初始化权重的初始化器。参考initializers
bias_initializer:权值初始化方法,为预定义初始化方法名的字符串,或用于初始化权重的初始化器。参考initializers
kernel_regularizer:施加在权重上的正则项,为Regularizer对象
bias_regularizer:施加在偏置向量上的正则项,为Regularizer对象
recurrent_regularizer:施加在循环核上的正则项,为Regularizer对象
activity_regularizer:施加在输出上的正则项,为Regularizer对象
kernel_constraints:施加在权重上的约束项,为Constraints对象
recurrent_constraints:施加在循环核上的约束项,为Constraints对象
bias_constraints:施加在偏置上的约束项,为Constraints对象
dropout:0~1之间的浮点数,控制输入线性变换的神经元断开比例
recurrent_dropout:0~1之间的浮点数,控制循环状态的线性变换的神经元断开比例
- 其他参数参考Recurrent的说明
StackedRNNCells层
keras.layers.StackedRNNCells(cells)
这是一个wrapper,用于将多个recurrent cell包装起来,使其行为类型单个cell。该层用于实现搞笑的stacked RNN
参数
- cells:list,其中每个元素都是一个cell对象
例子
cells = [keras.layers.LSTMCell(output_dim),keras.layers.LSTMCell(output_dim),keras.layers.LSTMCell(output_dim),
]inputs = keras.Input((timesteps, input_dim))
x = keras.layers.StackedRNNCells(cells)(inputs)
CuDNNGRU层
keras.layers.CuDNNGRU(units, kernel_initializer='glorot_uniform', recurrent_initializer='orthogonal', bias_initializer='zeros', kernel_regularizer=None, recurrent_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, recurrent_constraint=None, bias_constraint=None, return_sequences=False, return_state=False, stateful=False)
基于CuDNN的快速GRU实现,只能在GPU上运行,只能使用tensoflow为后端
参数
units:输出维度
activation:激活函数,为预定义的激活函数名(参考激活函数)
use_bias: 布尔值,是否使用偏置项
kernel_initializer:权值初始化方法,为预定义初始化方法名的字符串,或用于初始化权重的初始化器。参考initializers
recurrent_initializer:循环核的初始化方法,为预定义初始化方法名的字符串,或用于初始化权重的初始化器。参考initializers
bias_initializer:权值初始化方法,为预定义初始化方法名的字符串,或用于初始化权重的初始化器。参考initializers
kernel_regularizer:施加在权重上的正则项,为Regularizer对象
bias_regularizer:施加在偏置向量上的正则项,为Regularizer对象
recurrent_regularizer:施加在循环核上的正则项,为Regularizer对象
activity_regularizer:施加在输出上的正则项,为Regularizer对象
kernel_constraints:施加在权重上的约束项,为Constraints对象
recurrent_constraints:施加在循环核上的约束项,为Constraints对象
bias_constraints:施加在偏置上的约束项,为Constraints对象
dropout:0~1之间的浮点数,控制输入线性变换的神经元断开比例
recurrent_dropout:0~1之间的浮点数,控制循环状态的线性变换的神经元断开比例
- 其他参数参考Recurrent的说明
CuDNNLSTM层
keras.layers.CuDNNLSTM(units, kernel_initializer='glorot_uniform', recurrent_initializer='orthogonal', bias_initializer='zeros', unit_forget_bias=True, kernel_regularizer=None, recurrent_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, recurrent_constraint=None, bias_constraint=None, return_sequences=False, return_state=False, stateful=False)
基于CuDNN的快速LSTM实现,只能在GPU上运行,只能使用tensoflow为后端
参数
units:输出维度
activation:激活函数,为预定义的激活函数名(参考激活函数)
use_bias: 布尔值,是否使用偏置项
kernel_initializer:权值初始化方法,为预定义初始化方法名的字符串,或用于初始化权重的初始化器。参考initializers
recurrent_initializer:循环核的初始化方法,为预定义初始化方法名的字符串,或用于初始化权重的初始化器。参考initializers
bias_initializer:权值初始化方法,为预定义初始化方法名的字符串,或用于初始化权重的初始化器。参考initializers
kernel_regularizer:施加在权重上的正则项,为Regularizer对象
bias_regularizer:施加在偏置向量上的正则项,为Regularizer对象
recurrent_regularizer:施加在循环核上的正则项,为Regularizer对象
activity_regularizer:施加在输出上的正则项,为Regularizer对象
kernel_constraints:施加在权重上的约束项,为Constraints对象
recurrent_constraints:施加在循环核上的约束项,为Constraints对象
bias_constraints:施加在偏置上的约束项,为Constraints对象
dropout:0~1之间的浮点数,控制输入线性变换的神经元断开比例
recurrent_dropout:0~1之间的浮点数,控制循环状态的线性变换的神经元断开比例
- 其他参数参考Recurrent的说明
包装器Wrapper
TimeDistributed包装器
keras.layers.wrappers.TimeDistributed(layer)
该包装器可以把一个层应用到输入的每一个时间步上
参数
- layer:Keras层对象
输入至少为3D张量,下标为1的维度将被认为是时间维
例如,考虑一个含有32个样本的batch,每个样本都是10个向量组成的序列,每个向量长为16,则其输入维度为(32,10,16)
,其不包含batch大小的input_shape
为(10,16)
我们可以使用包装器TimeDistributed
包装Dense
,以产生针对各个时间步信号的独立全连接:
# as the first layer in a model
model = Sequential()
model.add(TimeDistributed(Dense(8), input_shape=(10, 16)))
# now model.output_shape == (None, 10, 8)# subsequent layers: no need for input_shape
model.add(TimeDistributed(Dense(32)))
# now model.output_shape == (None, 10, 32)
程序的输出数据shape为(32,10,8)
使用TimeDistributed
包装Dense
严格等价于layers.TimeDistribuedDense
。不同的是包装器TimeDistribued
还可以对别的层进行包装,如这里对Convolution2D
包装:
model = Sequential()
model.add(TimeDistributed(Convolution2D(64, 3, 3), input_shape=(10, 3, 299, 299)))
Bidirectional包装器
keras.layers.wrappers.Bidirectional(layer, merge_mode='concat', weights=None)
双向RNN包装器
参数
- layer:
Recurrent
对象 - merge_mode:前向和后向RNN输出的结合方式,为
sum
,mul
,concat
,ave
和None
之一,若设为None,则返回值不结合,而是以列表的形式返回
例子
model = Sequential()
model.add(Bidirectional(LSTM(10, return_sequences=True), input_shape=(5, 10)))
model.add(Bidirectional(LSTM(10)))
model.add(Dense(5))
model.add(Activation('softmax'))
model.compile(loss='categorical_crossentropy', optimizer='rmsprop')
编写自己的层
对于简单的定制操作,我们或许可以通过使用layers.core.Lambda
层来完成。但对于任何具有可训练权重的定制层,你应该自己来实现。
这里是一个Keras2的层应该具有的框架结构(如果你的版本更旧请升级),要定制自己的层,你需要实现下面三个方法
build(input_shape)
:这是定义权重的方法,可训练的权应该在这里被加入列表`self.trainable_weights
中。其他的属性还包括self.non_trainabe_weights
(列表)和self.updates
(需要更新的形如(tensor, new_tensor)的tuple的列表)。你可以参考BatchNormalization
层的实现来学习如何使用上面两个属性。这个方法必须设置self.built = True
,可通过调用super([layer],self).build()
实现call(x)
:这是定义层功能的方法,除非你希望你写的层支持masking,否则你只需要关心call
的第一个参数:输入张量compute_output_shape(input_shape)
:如果你的层修改了输入数据的shape,你应该在这里指定shape变化的方法,这个函数使得Keras可以做自动shape推断
from keras import backend as K
from keras.engine.topology import Layer
import numpy as npclass MyLayer(Layer):def __init__(self, output_dim, **kwargs):self.output_dim = output_dimsuper(MyLayer, self).__init__(**kwargs)def build(self, input_shape):# Create a trainable weight variable for this layer.self.kernel = self.add_weight(name='kernel', shape=(input_shape[1], self.output_dim),initializer='uniform',trainable=True)super(MyLayer, self).build(input_shape) # Be sure to call this somewhere!def call(self, x):return K.dot(x, self.kernel)def compute_output_shape(self, input_shape):return (input_shape[0], self.output_dim)
现存的Keras层代码可以为你的实现提供良好参考,阅读源代码吧!
致谢
本项目由以下贡献者贡献:
文档贡献
贡献者 | 页面 | 章节 | 类型 |
---|---|---|---|
Bigmoyan | keras.io的全部正文 | - | 翻译 |
Bigmoyan | 深度学习与Keras | CNN眼中的世界 | 翻译 |
Bigmoyan | 深度学习与Keras | 花式自动编码器 | 翻译 |
Bigmoyan | 快速开始 | 一些基本概念 | 编写 |
SCP-173 | 快速开始 | Keras安装和配置指南(Linux) | 编写 |
SCP-173 | 快速开始 | Keras安装和配置指南(Windows) | 编写 |
Bigmoyan | 深度学习与Keras | 面向小数据集构建图像分类模型 | 翻译 |
leo-nlp | 深度学习与Keras | 在Keras模型中使用预训练的词向量 | 翻译 |
zhourunlai | 工具 | I/O工具 | 翻译 |
Tips
贡献者 | 页面 |
---|---|
Bigmoyan | Tips处标注 |
3rduncle | Tips处标注 |
白菜 | Tips处标记 |
我是小将 | Tips处标记 |
zhourunlai | 可视化 |
Keras陷阱提示
贡献者 | 页面 |
---|---|
Bigmoyan | tf与th卷积核陷阱 |
Bigmoyan | 向BN层载入权重陷阱 |
Yin | validation_spilit与shuffle陷阱 |
Hui Liu | merge与Merge的区别 |
## Reviewers |
Reviewer | 页面 | 章节 |
---|---|---|
白菜 | 快速开始泛型模型 | 共享层 |
白菜 | 常用数据库 | IMDB影评倾向分类 |
doudou | 关于模型 | 关于Keras模型 |
doudou | 常用层 | Dense层 |
艾子 | 常用层 | Merge层 |
NUDT-小超人、、 | 快速开始Sequential模型 | Merge层 |
毛毛熊 | 常用数据库 | cifar-10 |
迷川浩浩 | 回调函数 | callback |
tadakey | 一些基本概念 | 张量 |
方渺渺 | 递归层 | recurrent层 |
leo-nlp | 快速开始泛型模型 | 共享层 |
单车 | 常用层 | Masking层 |
张涛 | 快速开始泛型模型 | 多输入和多输出模型 |
白菜 | FAQ | 如何观察中间层的输出 |
毒液 | 文本预处理 | one-hot |
毒液 | 回调函数 | EarlyStopping |
毒液 | 目标函数 | 可用的目标函数 |
毛毛熊 | 正则项 | 缩写 |
木子天一 | 局部连接层LocallyConnceted | LocallyConnected2D层 |
QiaXi | Pooling层 | GlobalMax/GlobalAve |
shawn | Callback | ModelCheckpoint |
smallYoki | 快速开始 | 泛型模型 |
示例程序
- 虚位以待
小额赞助
如果你觉得本文档对你的研究和使用有所帮助,欢迎扫下面的二维码对作者进行小额赞助,以鼓励作者进一步完善文档内容,提高文档质量。
keras学习-循环层Recurrent-包装器Wrapper-自己的相关推荐
- wrapper php,PHP流Streams、包装器wrapper概念与用法实例详解
本文实例讲述了PHP流Streams.包装器wrapper概念与用法.分享给大家供大家参考,具体如下: 流Streams这个概念是在php4.3引进的,是对流式数据的抽象,用于统一数据操作,比如文件数 ...
- php流Streams、包装器wrapper 详解
流Streams这个概念是在php4.3引进的,是对流式数据的抽象,用于统一数据操作,比如文件数据.网络数据.压缩数据等,以使可以共享同一套函数, php的文件系统函数就是这样的共享,比如file_g ...
- 对象包装器和自动装箱
包装器(wrapper): 基本数据int有一个与之对应的类------Integer,通常,这样的类称之为包装器(wrapper) 如果有一个ArrayList<>,尖括号里是不允许使用 ...
- Swift Property Wrapper 属性包装器
@propertyWrapper属性包装器:在定义存储属性时添加一个分离层,代表该属性被包装起来,且在包装器内部可以做一些事情.把一些通用复用的代码放在了包装器中,比如线程安全检查或者数据存储到数据库 ...
- 《Java 核心技术卷1 第10版》学习笔记------ 对象包装器、自动装箱、拆箱
有时, 需要将 int 这样的基本类型转换为对象. 所有的基本类型都冇一个与之对应的类.例如,Integer 类对应基本类型 int.通常, 这些类称为包装器 ( wrapper ) 这些对象包装器类 ...
- Keras中的循环层
Keras中的循环层 1.简单的RNN的Numpy实现 #简单的RNN的Numpy实现 import numpy as np timesteps=100#输入序列的时间步数 input_feature ...
- 知识图谱学习与实践(7)——网页数据抽取(包装器的使用)
互联网中蕴含着大量的数据资源,这些数据存在于html的代码之中,如何从浩瀚的代码中提取有效的数据,针对不同的情况,可以采用多种方法来实现网页数据的提取. 1 手工方法 网页呈现数据的方式,一般都是按照 ...
- Airsim动态 | 安装ROS包装器(AirSim ROS Wrapper)
本期内容我们将带来在Airsim环境下使用ROS Wrapper的相关教程,以下是AirSim客户端库上的一些ROS Wrapper相关配置. 一.启动 以下步骤适用于 Linux 系统.如果是在 W ...
- WPF学习笔记-单实例应用程序(包装器)
1.添加引用Microsoft.VisualBasic 2.创建 app类 class App : System.Windows.Application{protected override void ...
最新文章
- struts2 实现多文件限制上传
- 向量距离计算 java_Milvus 向量搜索引擎开源了!
- 动态规划之-----单调递增最长子序列(nyoj17)
- python ide是什么意思_初学Python使用什么IDE会更好?
- 领域驱动 开源项目_在开源领域建立职业的建议
- HTTP协议 (四) 缓存
- android 默认焦点设置_Android界面设计基础:控件焦点4个步骤
- 人工智能:从单细胞生物的智能说起
- 性能测试---性能指标【1】
- php变量控制结构与函数,LAMP兄弟连原创视频教程(PHP笔记一--变量,流程控制结构,函数)...
- Python分析并绘制可视化动态地图,实时查询全球疫情数据(11月最新...)
- 关于学计算机趣味段子,【学习段子】_关于学习的经典段子15句
- CSS-----颜色值的缩写和字体的缩写方法
- 比excel好用,还能解决数据孤岛问题,这款报表工具千万别错过
- Fiddler下载安装及手机抓包--小白版
- iOS 支持webrtc的浏览器 bowser
- 大电流输出信号隔离转换模块
- USACO Section 1.2 Broken Necklace
- 谷粒商城十elasticsearch搜索服务及商品上架
- 新冠状病毒的基因序列