Tensorflow LSTM model. Размерность входных данных

Пытаюсь обучить LSTM нейронную сеть:

N = 100
Q = 200
model_lstm = Sequential()
model_lstm.add(LSTM(units=102, input_shape=(N + 2,1), return_sequences=True))
model_lstm.add(Dense(64, activation = "relu"))
model_lstm.add(Dense(1, activation = "relu"))

model_lstm.compile(optimizer='adam', 
              loss=tf.keras.losses.MeanAbsoluteError(), 
              metrics=['accuracy'])
model_lstm.build(input_shape=(N+2,))
model_lstm.summary()

После этого генерирую данные для обучения. LSTM Требует что бы входной массив был 2-хмерным (то есть последовательность). Так что переформирую x

x.shape # 200, 102
x = x.reshape(200, 102, 1)
model_lstm.fit(x=x, y=y)

Выходит вот такая ошибка:

ValueError                                Traceback (most recent call last)
<ipython-input-24-e77db80ef65f> in <module>()
     16   t *= 2
     17   x = x.reshape(200, 102, 1)
---> 18   model_lstm.fit(x=x, y=y)

1 frames
/usr/local/lib/python3.7/dist-packages/tensorflow/python/framework/func_graph.py in autograph_handler(*args, **kwargs)
   1145           except Exception as e:  # pylint:disable=broad-except
   1146             if hasattr(e, "ag_error_metadata"):
-> 1147               raise e.ag_error_metadata.to_exception(e)
   1148             else:
   1149               raise

ValueError: in user code:

    File "/usr/local/lib/python3.7/dist-packages/keras/engine/training.py", line 1021, in train_function  *
        return step_function(self, iterator)
    File "/usr/local/lib/python3.7/dist-packages/keras/engine/training.py", line 1010, in step_function  **
        outputs = model.distribute_strategy.run(run_step, args=(data,))
    File "/usr/local/lib/python3.7/dist-packages/keras/engine/training.py", line 1000, in run_step  **
        outputs = model.train_step(data)
    File "/usr/local/lib/python3.7/dist-packages/keras/engine/training.py", line 860, in train_step
        loss = self.compute_loss(x, y, y_pred, sample_weight)
    File "/usr/local/lib/python3.7/dist-packages/keras/engine/training.py", line 919, in compute_loss
        y, y_pred, sample_weight, regularization_losses=self.losses)
    File "/usr/local/lib/python3.7/dist-packages/keras/engine/compile_utils.py", line 201, in __call__
        loss_value = loss_obj(y_t, y_p, sample_weight=sw)
    File "/usr/local/lib/python3.7/dist-packages/keras/losses.py", line 141, in __call__
        losses = call_fn(y_true, y_pred)
    File "/usr/local/lib/python3.7/dist-packages/keras/losses.py", line 245, in call  **
        return ag_fn(y_true, y_pred, **self._fn_kwargs)
    File "/usr/local/lib/python3.7/dist-packages/keras/losses.py", line 1457, in mean_absolute_error
        return backend.mean(tf.abs(y_pred - y_true), axis=-1)

    ValueError: Dimensions must be equal, but are 102 and 100 for '{{node mean_absolute_error/sub}} = Sub[T=DT_FLOAT](mean_absolute_error/remove_squeezable_dimensions/Squeeze, IteratorGetNext:1)' with input shapes: [?,102], [?,100].

Пытался по разному изменять размерность входных данных, транспонировал, переворачивал итп, оно все равно не хочет их принимать.


Ответы (1 шт):

Автор решения: BlueScreen

Ошибка была в указании размерностей в моделе. Нужно передовать последовательность чисел, а не вектор высотой N.

model_lstm = Sequential()
model_lstm.add(LSTM(units=100, input_shape=(1,N+2), return_sequences=True))
model_lstm.add(Dense(64, activation = "relu"))
model_lstm.add(Dense(100, activation = "relu"))

model_lstm.compile(optimizer='adam', 
              loss=tf.keras.losses.MeanAbsoluteError(), 
              metrics=['accuracy'])
model_lstm.build(input_shape=(N+2,))
model_lstm.summary()
→ Ссылка