我已经阅读了有关此问题的其他一些主题,但是由于我使用的损失函数通常比我的复杂得多,因此我不知道如何解决该问题。我相信答案是关于在损失函数的某处添加一个1e-10
这样的小值,但我不知道在哪里。我的数据有6个时间序列,已转换为日志返回。我建立了一个编码器-解码器模型,该模型分批接收大小为60的所有6个时间序列的值,并预测以下30个值。
我尝试将1e-10
添加到损失函数的各个部分,但是当我运行模型时,它仍然会损失Nan。另外,万一重要,我计划在下次尝试中使用MinMaxScaler转换数据,而不是使用日志返回。不知道这是否很重要,但以防万一它改变了解决此问题的方式。
我还尝试了其他方面的改变:我使用了原始的未转换数据,还尝试了LSTM层的tanh激活以及不同的优化器,无论它对Nan造成了什么损失。
如果我将损失更改为'mse'
,那么它似乎可以正常工作,并且训练和验证的损失都在1.5e-6
左右。
有任何想法吗?谢谢!
这是我为防万一:
data_lr = pd.DataFrame()
for column in data.columns:
data_lr['log_return_'+column] = np.log(data[column]/data[column].shift(1))
data_lr.dropna(inplace=True)
data_lr.head()
这是数据的第一行,用于显示值:
log_return_sample_0 log_return_sample_1 log_return_sample_2 log_return_sample_3 log_return_sample_4 log_return_sample_5
day.minute
0.1 -0.001386 -0.001578 -0.001115 -0.000758 -0.000910 0.000223
0.2 0.001386 0.000226 -0.002514 -0.002847 -0.003647 0.000669
0.3 0.000346 0.001353 -0.000839 -0.000951 -0.001600 0.001336
0.4 0.000692 0.000676 0.000839 0.000380 0.000457 0.000667
0.5 0.000000 -0.000450 0.000000 0.000570 0.000914 0.002443
这是损失函数:
from keras.models import Sequential
from keras.layers import LSTM
from keras.layers import Dense
from keras.layers import RepeatVector
from keras.layers import TimeDistributed
import tensorflow.keras.backend as kb
def custom_loss_function(y_actual, y_hat):
custom_loss_value = kb.mean(kb.abs(kb.log(y_hat/y_actual)))
return custom_loss_value
这是模型:
model_LSTM = Sequential()
model_LSTM.add(LSTM(200, activation='relu', input_shape=(n_steps_in, num_features)))
model_LSTM.add(RepeatVector(n_steps_out))
model_LSTM.add(LSTM(200, activation='relu', return_sequences=True))
model_LSTM.add(TimeDistributed(Dense(num_features)))
model_LSTM.compile(optimizer='adam', loss=custom_loss_function)
这是模型摘要:
Model: "sequential_2"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
lstm_3 (LSTM) (None, 200) 165600
_________________________________________________________________
repeat_vector_2 (RepeatVecto (None, 30, 200) 0
_________________________________________________________________
lstm_4 (LSTM) (None, 30, 200) 320800
_________________________________________________________________
time_distributed_2 (TimeDist (None, 30, 6) 1206
=================================================================
Total params: 487,606
Trainable params: 487,606
Non-trainable params: 0
_________________________________________________________________
None
最后我跑了:
model_LSTM.fit(X, y, epochs=10, verbose=2, validation_split=0.1)
编辑:为防万一,以下是前几行未转换的原始值:
sample_0 sample_1 sample_2 sample_3 sample_4 sample_5
day.minute
0.0 28.88 44.39 35.89 52.81 43.99 44.84
0.1 28.84 44.32 35.85 52.77 43.95 44.85
0.2 28.88 44.33 35.76 52.62 43.79 44.88
0.3 28.89 44.39 35.73 52.57 43.72 44.94
0.4 28.91 44.42 35.76 52.59 43.74 44.97