我使用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激活功能,并且一些预测值是负的,但仍然很难追上最低的可能值。我的问题是:
答案 0 :(得分:1)
使用ReLU,您应该将值从0缩放到1,而不仅仅是消除均值和偏差。
ReLu Activation function-问自己:当将此负函数与负值一起使用时会发生什么?