Keras_rnn以及多层rnn

2017-10-17  本文已影响0人  苟且偷生小屁屁
图片.png
  • RNN的X输入是分TIME_STEPS和INPUT_SIZE两部分的, 所以X的输入是有时序关系的, 这里的时序和RNN的时序有什么区别?
  • 答案是:
  1. X的TIME_STEPS指的是单个X的输入,例如X_t,它本身就是一个时序的输入,单位时间,X_t只能输入一个序列的INPUT_SIZE,并且X_t是有INPUT_SIZE个这样的序列组成的.(这样其实就跟CNN的图像序列从表面上看没有什么不同了,只是CNN更关注像素点之间的空间关系,而RNN更关注输入之间的时序关系)
  2. 真正的时序是忘记,记忆门,也就是一个单元的RNN或者更多的时候我们将其称为一个CELL才是实际的时间流,即S_t-1, S_t, S_t+1,这里包含有一种选择记忆,选择忘记的机制(LSTM),或者更多的时候我们也可以看做是隐藏层神经元的个数
  • SimpleRNN层
keras.layers.recurrent.SimpleRNN(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, 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之间的浮点数,控制循环状态的线性变换的神经元断开比例

例子:

# 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.

这种写法为标准写法, input_shape=(序列的个数,序列的维度),只有第一层输入要求指定输入的维度.

# the following is identical:
model = Sequential()
model.add(LSTM(32, input_dim=64, input_length=10))

这是分开写的方法,
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))

为了堆叠lstm获得更好的结果,希望能够将多个lstm叠加在一起,相当于多个隐藏层
关键在于

return_sequences=(默认是False) True

若为True则返回整个序列,否则仅返回输出序列的最后一个输出.
即如果是False则只有最后一个序列的结果输出,这样就少了input_length这一维,如果要堆叠LSTM,则必须将return_sequences设置为True

上一篇下一篇

猜你喜欢

热点阅读