在时间序列回归编码器-解码器模型中为Keras中的自定义损失函数获取Nan

时间:2020-06-05 08:16:14

标签: python tensorflow keras lstm loss-function

我已经阅读了有关此问题的其他一些主题,但是由于我使用的损失函数通常比我的复杂得多,因此我不知道如何解决该问题。我相信答案是关于在损失函数的某处添加一个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

0 个答案:

没有答案