Time series 为什么我的LSTM模型重复前面的值?

Time series 为什么我的LSTM模型重复前面的值?,time-series,keras,lstm,anomaly-detection,Time Series,Keras,Lstm,Anomaly Detection,我在Keras中构建了一个简单的LSTM模型,如下所示: model = Sequential() model.add(keras.layers.LSTM(hidden_nodes, input_dim=num_features, input_length=window, consume_less="mem")) model.add(keras.layers.Dense(num_features, activation='sigmoid')) optimizer = keras.optimize

我在Keras中构建了一个简单的LSTM模型,如下所示:

model = Sequential()
model.add(keras.layers.LSTM(hidden_nodes, input_dim=num_features, input_length=window, consume_less="mem"))
model.add(keras.layers.Dense(num_features, activation='sigmoid'))
optimizer = keras.optimizers.SGD(lr=learning_rate, decay=1e-6, momentum=0.9, nesterov=True)
当我将模型应用于某些数据时,我有一种特殊的行为:

其中橙色线代表预测值,蓝色线代表大真理

如您所见,网络重复先前的值,但这不是我想要的。我有几个功能(不仅仅是图片中显示的功能),我希望网络考虑到与其他时间序列的依赖关系,而不是只查看单个时间序列的过去数据并重复以前的数据

我希望问题足够清楚

我的数据
我有36个时间序列(分类和数字数据)。我使用一个长度为W的窗口,并重新存储数据,以创建Keras所需形式的numpy向量(num_样本、窗口、num_特征)

编辑1
数据样本:

0.5, 0.1, 0.4, 1, 0,74
0.1, 0.1, 0.8, 0.9, 0,8
0.2, 0.3, 0.5, 1, 0,85
我有一个分类属性和两个数字属性。前三行是指分类的一行(分类的一个热编码)。最后两个是指两个数值属性

我构建培训和测试,如下所示:

所以我执行
model.fit(T,X)

我也尝试了少量的隐藏节点,但结果是一样的

编辑2
考虑使用数字和分类特征的自定义损失函数:

def mixed_num_cat_loss_backend(y_true, y_pred, signals_splits):
    if isinstance(y_true, np.ndarray):
        y_true = keras.backend.variable( y_true )
    if isinstance(y_pred, np.ndarray):
        y_pred = keras.backend.variable( y_pred )

    y_true_mse = y_true[:,:signals_splits[0]] 
    y_pred_mse = y_pred[:,:signals_splits[0]]
    mse_loss_v = keras.backend.square(y_true_mse-y_pred_mse)

    categ_loss_v = [ keras.backend.categorical_crossentropy(
                         y_pred[:,signals_splits[i-1]:signals_splits[i]], 
                         y_true[:,signals_splits[i-1]:signals_splits[i]], 
                         from_logits=False) # force keras to normalize
                   for i in range(1,len(signals_splits)) ]

    losses_v = keras.backend.concatenate( [mse_loss_v, keras.backend.stack(categ_loss_v,1)], 1)

    return losses_v
我使用
model.fit(T,X)
来知道数字特征(在矩阵中)的位置

这是一个从2D numpy数组开始准备数据的函数,如图M、T、X所示:

def prepare_training_data(data_matrix, boundaries, window = 5):

    num_rows, num_columns = data_matrix.shape
    effective_sizes = [max(0,(nrows - window)) for nrows in boundaries]
    total_training_rows = sum(effective_sizes)

    print " - Skipped dumps because smaller than window:", sum([z==0 for z in effective_sizes])

    # prepare target variables
    T = data_matrix[window:boundaries[0],:]

    start_row = boundaries[0]
    for good_rows, total_rows in zip(effective_sizes[1:],boundaries[1:]):
        if good_rows>0:
            T = np.vstack( (T,data_matrix[start_row+window:start_row+total_rows,:]) )
        start_row += total_rows
        # check concatenate

    # training input to the LSTM
    X = np.zeros((total_training_rows, window, num_columns))
    curr_row = 0
    curr_boundary = 0
    for good_rows, total_rows in zip(effective_sizes,boundaries):
        for i in range(good_rows):
            X[curr_row] = data_matrix[curr_boundary+i:curr_boundary+i+window,:]
            curr_row += 1
        curr_boundary += total_rows

    return X,T,effective_sizes

你的数据是什么?你是如何训练的?如果您传递与输入和输出相同的数据,它肯定会学习复制输入。@DanielMöller我编辑了这个问题。我不明白你所说的“输入和输出的数据相同”是什么意思。看到你作为输入和输出传递给
model.fit
,或者至少是你用来生成数组的代码的一小部分数据会很有帮助。您的模型是否可能过度拟合,或者是因为数据不足,
隐藏节点太高(或者只是训练数据中的一个错误)?LSTM无法预测过去,它们遵循“顺序”。秩序很重要。他们预测未来。如果你要预测过去,你必须至少颠倒数据的顺序。我对一个有3个参数的损失函数很好奇。你怎么把它传给模特?