keras学习-循环层Recurrent-包装器Wrapper-自己的

循环层Recurrent

Recurrent层

keras.layers.recurrent.Recurrent(return_sequences=False, go_backwards=False, stateful=False, unroll=False, implementation=0)

这是循环层的抽象类,请不要在模型中直接应用该层(因为它是抽象类,无法实例化任何对象)。请使用它的子类LSTMGRUSimpleRNN

所有的循环层(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的说明

参考文献


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的说明

参考文献


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的说明

参考文献

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,aveNone之一,若设为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 np

class MyLayer(Layer):

    def __init__(self, output_dim, **kwargs):
        self.output_dim = output_dim
        super(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层代码可以为你的实现提供良好参考,阅读源代码吧!

 

致谢

本项目由以下贡献者贡献:

文档贡献

贡献者页面章节类型
Bigmoyankeras.io的全部正文-翻译
Bigmoyan深度学习与KerasCNN眼中的世界翻译
Bigmoyan深度学习与Keras花式自动编码器翻译
Bigmoyan快速开始一些基本概念编写
SCP-173快速开始Keras安装和配置指南(Linux)编写
SCP-173快速开始Keras安装和配置指南(Windows)编写
Bigmoyan深度学习与Keras面向小数据集构建图像分类模型翻译
leo-nlp深度学习与Keras在Keras模型中使用预训练的词向量翻译
zhourunlai工具I/O工具翻译

Tips

贡献者页面
BigmoyanTips处标注
3rduncleTips处标注
白菜Tips处标记
我是小将Tips处标记
zhourunlai可视化

Keras陷阱提示

贡献者页面
Bigmoyantf与th卷积核陷阱
Bigmoyan向BN层载入权重陷阱
Yinvalidation_spilit与shuffle陷阱
Hui Liumerge与Merge的区别
## Reviewers 
Reviewer页面章节
白菜快速开始泛型模型共享层
白菜常用数据库IMDB影评倾向分类
doudou关于模型关于Keras模型
doudou常用层Dense层
艾子常用层Merge层
NUDT-小超人、、快速开始Sequential模型Merge层
毛毛熊常用数据库cifar-10
迷川浩浩回调函数callback
tadakey一些基本概念张量
方渺渺递归层recurrent层
leo-nlp快速开始泛型模型共享层
单车常用层Masking层
张涛快速开始泛型模型多输入和多输出模型
白菜FAQ如何观察中间层的输出
毒液文本预处理one-hot
毒液回调函数EarlyStopping
毒液目标函数可用的目标函数
毛毛熊正则项缩写
木子天一局部连接层LocallyConncetedLocallyConnected2D层
QiaXiPooling层GlobalMax/GlobalAve
shawnCallbackModelCheckpoint
smallYoki快速开始泛型模型

示例程序

  • 虚位以待

小额赞助

如果你觉得本文档对你的研究和使用有所帮助,欢迎扫下面的二维码对作者进行小额赞助,以鼓励作者进一步完善文档内容,提高文档质量。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值