- RNN的X输入是分TIME_STEPS和INPUT_SIZE两部分的, 所以X的输入是有时序关系的, 这里的时序和RNN的时序有什么区别?
- 答案是:
- X的TIME_STEPS指的是单个X的输入,例如X_t,它本身就是一个时序的输入,单位时间,X_t只能输入一个序列的INPUT_SIZE,并且X_t是有INPUT_SIZE个这样的序列组成的.(这样其实就跟CNN的图像序列从表面上看没有什么不同了,只是CNN更关注像素点之间的空间关系,而RNN更关注输入之间的时序关系)
- 真正的时序是忘记,记忆门,也就是一个单元的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