Несовместимые формы: Tensorflow / Keras Sequential LSTM с автокодированием

#python #tensorflow #keras #deep-learning #lstm

#python #tensorflow #keras #глубокое обучение #lstm

Вопрос:

Я пытаюсь настроить автоэнкодер / декодер LSTM для данных временных рядов и постоянно получаю Incompatible shapes ошибку при попытке обучить модель. Следующие шаги и использование игрушечных данных из этого примера. Смотрите приведенный ниже код и результаты. Обратите внимание на версию 2.3.0 Tensorflow.

Создайте данные. Поместите данные в последовательности для временной привязки к LSTM в виде (образцов, временных меток, объектов).

 timeseries = np.array([[0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9],
                       [0.1**3, 0.2**3, 0.3**3, 0.4**3, 0.5**3, 0.6**3, 0.7**3, 0.8**3, 0.9**3]]).transpose()

timeseries_df = pd.DataFrame(timeseries)

def create_sequenced_dataset(X, time_steps=10):
    Xs, ys = [], []  # start empty list
    for i in range(len(X) - time_steps):  # loop within range of data frame minus the time steps
        v = X.iloc[i:(i   time_steps)].values  # data from i to end of the time step
        Xs.append(v)
        ys.append(X.iloc[i   time_steps].values)

    return np.array(Xs), np.array(ys)  # convert lists into numpy arrays and return

X, y = create_sequenced_dataset(timeseries_df, time_steps=3)
timesteps = X.shape[1]
n_features = X.shape[2]
  

Создайте модель LSTM с автоэнкодером / декодером, заданным вектором повтора, и попытайтесь обучить модель.

 model = Sequential()
model.add(LSTM(128, input_shape=(timesteps, n_features), return_sequences=False))
model.add(RepeatVector(timesteps))
model.add(LSTM(128, return_sequences=True))
model.add(TimeDistributed(Dense(n_features)))
model.compile(optimizer='adam', loss='mse')
model.summary()

model.fit(X, y, epochs=10, batch_size=4)
  

Постоянно выдает ошибку:

 tensorflow.python.framework.errors_impl.InvalidArgumentError:  Incompatible shapes: [4,3,2] vs. [4,2]
     [[node gradient_tape/mean_squared_error/BroadcastGradientArgs (defined at <ipython-input-9-56896428cea9>:1) ]] [Op:__inference_train_function_10833]
  

X выглядит как:

 array([[[0.1  , 0.001],
        [0.2  , 0.008],
        [0.3  , 0.027]],
       [[0.2  , 0.008],
        [0.3  , 0.027],
        [0.4  , 0.064]],
       [[0.3  , 0.027],
        [0.4  , 0.064],
        [0.5  , 0.125]],
       [[0.4  , 0.064],
        [0.5  , 0.125],
        [0.6  , 0.216]],
       [[0.5  , 0.125],
        [0.6  , 0.216],
        [0.7  , 0.343]],
       [[0.6  , 0.216],
        [0.7  , 0.343],
        [0.8  , 0.512]]])
  

y выглядит как:

 array([[0.4  , 0.064],
       [0.5  , 0.125],
       [0.6  , 0.216],
       [0.7  , 0.343],
       [0.8  , 0.512],
       [0.9  , 0.729]])
  

Комментарии:

1. Можете ли вы также распечатать формы X и y?

Ответ №1:

Я надеюсь, переводчик правильно переведет мою идею. Я тоже сначала не понял, в чем проблема, но потом я снова прочитал определение автоэнкодера. Поскольку это автоэнкодер, мы применяем X к вводу и выводу (y никоим образом не участвует в модели, поскольку мы пытаемся определить зависимости в данных X, а затем воссоздать их). В некоторых есть код по этой теме (y = x.copy ()), в то время как здесь это применимо (model.fit (X, X, epochs = 300, batch_size = 5, verbose = 0)).

Комментарии:

1. Я думаю, что понимаю, к чему вы клоните, и это отражает то, что я изучаю. Для автоэнкодера входные и выходные данные обязательно имеют одинаковые формы. Однако я не думаю, что сам вывод должен быть точной копией ввода?

Ответ №2:

Как ясно сказано в сообщении, это проблема с формой, которую вы передаете модели для подгонки.

Из приведенных выше данных, которые вы предоставили, X имеет форму (6, 3, 2) , а Y имеет форму (6, 2) , что несовместимо.

Ниже приведен измененный код с теми же входными данными, что и в примере, который вы взяли с X и Y имеющим форму (6,3,2) .

 model = Sequential()
model.add(LSTM(128, input_shape=(timesteps, n_features), return_sequences=False))
model.add(RepeatVector(timesteps))
model.add(LSTM(128, return_sequences=True))
model.add(TimeDistributed(Dense(n_features)))
model.compile(optimizer='adam', loss='mse')
model.summary()  

model.fit(X,Y, epochs=10, batch_size=4)
  

Результат:

 Epoch 1/10
2/2 [==============================] - 0s 5ms/step - loss: 0.0069
Epoch 2/10
2/2 [==============================] - 0s 4ms/step - loss: 0.0065
Epoch 3/10
2/2 [==============================] - 0s 4ms/step - loss: 0.0065
Epoch 4/10
2/2 [==============================] - 0s 4ms/step - loss: 0.0062
Epoch 5/10
2/2 [==============================] - 0s 4ms/step - loss: 0.0059
Epoch 6/10
2/2 [==============================] - 0s 4ms/step - loss: 0.0053
Epoch 7/10
2/2 [==============================] - 0s 5ms/step - loss: 0.0048
Epoch 8/10
2/2 [==============================] - 0s 5ms/step - loss: 0.0046
Epoch 9/10
2/2 [==============================] - 0s 5ms/step - loss: 0.0044
Epoch 10/10
2/2 [==============================] - 0s 6ms/step - loss: 0.0043
<tensorflow.python.keras.callbacks.History at 0x7ff352f9ccf8>