Keras的lstm网络中用于序列预测的激活函数有哪些?

时间:2018-07-20 06:55:55

标签: python tensorflow neural-network keras lstm

我使用Keras中的TimeDistributed层建立了一个网络来同时预测4个时间序列,例如[呼吸,血压,脉搏,spo2]。在馈入网络之前,我使用sklearn.preprocessing.StandardScaler函数对序列进行归一化。这是原始数据和规范化数据的快照:

Original:                   Normalized:         
resp sysbp pulse spo2       resp    sysbp        pulse       spo2
18  111.5   71  97      -0.322154   -0.007753   -0.865683    0.051831
18  109.5   71  97      -0.322154   -0.067897   -0.865683    0.051831
19  122     70  97      -0.151163    0.308004   -0.922641    0.051831
18  128     72  98      -0.322154    0.488436   -0.808725    0.292901
18  125     71  96      -0.322154    0.39822    -0.865683   -0.189238
20  113     71  96       0.019828    0.037355   -0.865683   -0.189238
16  121     71  96      -0.664136    0.277932   -0.865683   -0.189238
20  119     71  97       0.019828    0.217788   -0.865683    0.051831
18  119    71.5 97      -0.322154    0.217788   -0.837204    0.051831
19  119     88  97      -0.151163    0.217788    0.102603    0.051831
16  119     88  97      -0.664136    0.217788    0.102603    0.051831
14  119     87  97      -1.006117    0.217788    0.045645    0.051831
19  119     88  98      -0.151163    0.217788    0.102603    0.292901
29  119     92  96       1.558744    0.217788    0.330435   -0.189238

归一化前后的范围分别为: resp=[0,99] & [-3.4,13.5], sysbp=[0,269] & [-3.3,4.7], pulse=[0,204] & [-4.9,6.7], spo2=[0,100] & [-23.3,0.77]

我已经按照长度为200的时间步构建了数据,提到的批量大小为100,而维数则为4,因此,我的神经网络的结构如下:

batch_size=100
x = Input(batch_shape=(batch_size,200,4) , name='input')
mask = Masking(mask_value=0., name='input_masked')(x)
lstm1 = Bidirectional(LSTM(4, name="lstm1", dropout=0.25, recurrent_dropout=0.1, return_sequences=True, stateful=True))(mask)
output1 = TimeDistributed(Dense(4, activation='relu'), name='output1')(lstm1)
model = Model(inputs=x, outputs=output1)
optimizer = Adam(lr=0.001)
model.compile(optimizer=optimizer, loss='mean_absolute_error', metrics=['accuracy'])
history = model.fit(X_train, [y_train1, y_train2], batch_size=batch_size, epochs=500, verbose=1)

对网络进行了无错误的培训,并提供了 85%的准确性。现在,但是当我使用训练有素的网络预测测试数据时,预测数据字段的输出范围为正。因此,在反比例缩放之后,可以很好地预测较高的值,但是根本无法预测较低的值。它走到最低点直到变量的平均值。

为了进行实验,我什至尝试使用PReLU激活功能,并且一些预测值是负的,但仍然很难追上最低的可能值。我的问题是:

  • 序列预测的结构和方法是否正确或正确 我想念什么吗?
  • 而且,我应该使用更好的激活功能吗?

1 个答案:

答案 0 :(得分:1)

使用ReLU,您应该将值从0缩放到1,而不仅仅是消除均值和偏差。

ReLu Activation function-问自己:当将此负函数与负值一起使用时会发生什么?