Обучающие LSTM Автоэнкодеры - PullRequest
0 голосов
/ 21 января 2020

Я пытался обучить автокодер LSTM для сжатия временного ряда в вектор фиксированной длины. Я явно маскирую входные временные шаги со всеми значениями как 0,0 во входной последовательности, используя второе решение, предоставленное в Как замаскировать входы в автоэнкодере LSTM, имеющем слой RepeatVector ()? . Мой код выглядит следующим образом:

import tensorflow.keras.layers as tfkl
import tensorflow.keras as tfk
import tensorflow as tf

class lstm_bottleneck(tf.keras.layers.Layer):
    def __init__(self, lstm_units, time_steps, **kwargs):
        self.lstm_units = lstm_units
        self.time_steps = time_steps
        self.lstm_layer = tfkl.LSTM(lstm_units, return_sequences=False)
        self.repeat_layer = tfkl.RepeatVector(time_steps)
        super(lstm_bottleneck, self).__init__(**kwargs)
    def call(self, inputs):
        return self.repeat_layer(self.lstm_layer(inputs))
    def compute_mask(self, inputs, mask=None):
        return mask

time_steps = 342
n_features = 6
input_layer = tfkl.Input(shape=(time_steps, n_features))
x = tfk.layers.Masking(mask_value=0)(input_layer)
x = tfkl.LSTM(25, return_sequences=True)(x)
x = tfkl.LSTM(50, return_sequences=True)(x)
x = lstm_bottleneck(lstm_units=100, time_steps=time_steps)(x)
x = tfkl.LSTM(50, return_sequences=True)(x)
x = tfkl.LSTM(25, return_sequences=True)(x)
x = tfkl.LSTM(12, return_sequences=True)(x)
x = tfk.layers.Dense(n_features)(x)
lstm_ae = tfk.models.Model(inputs=input_layer, outputs=x)
lstm_ae.compile(optimizer='adam', loss='mse')
print(lstm_ae.summary())

После обучения примерно 200 эпох мой вывод будет следующим:

array([[0.04740356, 0.0341703 , 0.04846119, 0.0243171 , 0.04879719,
        0.05780672],
       [0.04740356, 0.0341703 , 0.04846119, 0.0243171 , 0.04879719,
        0.05780672],
       [0.04740356, 0.0341703 , 0.04846119, 0.0243171 , 0.04879719,
        0.05780672],
       ...,
       [0.46373847, 0.3770589 , 0.35932896, 0.3780836 , 0.3275618 ,
        0.69627523],
       [0.4637023 , 0.37701428, 0.3592309 , 0.37801573, 0.32751018,
        0.6962767 ],
       [0.4636663 , 0.3769699 , 0.35913378, 0.37794843, 0.32745892,
        0.69627804]], dtype=float32)

Мой ввод для этого вывода:

array([[0.        , 0.        , 0.        , 0.        , 0.        ,
        0.        ],
       [0.        , 0.        , 0.        , 0.        , 0.        ,
        0.        ],
       [0.        , 0.        , 0.        , 0.        , 0.        ,
        0.        ],
       ...,
       [0.0952381 , 0.14285714, 0.76190476, 1.        , 0.36842105,
        0.69565217],
       [0.76190476, 0.5       , 0.14285714, 0.25      , 0.89473684,
        0.26086957],
       [0.66666667, 0.        , 0.04761905, 0.25      , 0.05263158,
        0.47826087]])

Я мог видеть большое отклонение от желаемого результата и моих фактических результатов даже после 200 эпох. Может кто-нибудь сказать мне, что здесь не так и как это исправить?

...