Я пытался обучить автокодер 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 эпох. Может кто-нибудь сказать мне, что здесь не так и как это исправить?