Запутался в том, как объединить CONV1D и LSTM

#python #python-3.x #keras #lstm #tf.keras

#python #python-3.x #keras #lstm #tf.keras

Вопрос:

Я изо всех сил пытаюсь понять этот код, который сочетает в себе оба CONV1D и LSTM .

 model = tf.keras.models.Sequential([
  tf.keras.layers.Conv1D(filters=32, kernel_size=5,
                      strides=1, padding="causal",
                      activation="relu",
                      input_shape=[None, 1]),
  tf.keras.layers.LSTM(64, return_sequences=True),
  tf.keras.layers.LSTM(64, return_sequences=True),
  tf.keras.layers.Dense(30, activation="relu"),
  tf.keras.layers.Dense(10, activation="relu"),
  tf.keras.layers.Dense(1),
  tf.keras.layers.Lambda(lambda x: x * 400)
])

Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv1d (Conv1D)              (None, None, 32)          192       
_________________________________________________________________
lstm (LSTM)                  (None, None, 64)          24832     
_________________________________________________________________
lstm_1 (LSTM)                (None, None, 64)          33024     
_________________________________________________________________
dense (Dense)                (None, None, 30)          1950      
_________________________________________________________________
dense_1 (Dense)              (None, None, 10)          310       
_________________________________________________________________
dense_2 (Dense)              (None, None, 1)           11        
_________________________________________________________________
lambda (Lambda)              (None, None, 1)           0         
=================================================================
Total params: 60,319
Trainable params: 60,319
Non-trainable params: 0
_________________________________________________________________
  

Если мы удалим CONV1D слой и второй LSTM слой, я в полном порядке. Тем не менее, я глубоко смущен этой структурой.

Во-первых, почему мы добавляем return_sequences=True второй LSTM уровень? Обычно мы добавляем только return_sequences=True на первом LSTM уровне в случае stacked LSTM . В этой модели мы добавляем его к обоим.

Во-вторых, почему input_shape=[None, 1] CONV1D слой in? не CONV1D является и LSTM несколько похожим по форме?

 Conv1D: (batch, length, channels)
LSTM: (batch, timeSteps, features)
  

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

Ответ №1:

Если вы хотите, чтобы ваш вывод представлял собой последовательность, например, если вы хотите предсказать 10 следующих значений, последним return_sequences должно быть True . Если у вас есть 10 временных шагов в ваших данных, он вернет последовательность из 10 временных шагов. Например.:

 import numpy as np
import tensorflow as tf

model = tf.keras.models.Sequential([
  tf.keras.layers.Conv1D(filters=32, kernel_size=5,
                      strides=1, padding="causal",
                      activation="relu",
                      input_shape=[None, 1]),
  tf.keras.layers.LSTM(64, return_sequences=True),
  tf.keras.layers.LSTM(64, return_sequences=True),
  tf.keras.layers.Dense(30, activation="relu"),
  tf.keras.layers.Dense(10, activation="relu"),
  tf.keras.layers.Dense(1),
  tf.keras.layers.Lambda(lambda x: x * 400)
])

model(np.random.rand(1, 10, 1))
  
 <tf.Tensor: shape=(1, 10, 1), dtype=float32, numpy=
array([[[ 0.12037009],
        [ 0.19570792],
        [ 0.3986496 ],
        [ 0.56172705],
        [-0.06423644],
        [-0.4780491 ],
        [-0.82960564],
        [-1.2271142 ],
        [-1.8704925 ],
        [-2.294954  ]]], dtype=float32)>
  

Я не понимаю вашего второго вопроса.

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

1. Спасибо Николас за ответ. Я понимаю, что вы имеете в виду. Но мой вопрос в том, как это возможно, что мы можем объединить return_sequences=True со dense слоем? Обычно мы делаем это с return_sequences=False помощью . Что касается моего второго вопроса, я не понимаю input_shape CONV1D слоя.

Ответ №2:

Этот код использует sequence-to-sequence прогнозирование, а не sequence-to-vector так, как описано в этом видео (ссылка ниже). Именно по этой причине мы добавили return_sequences=True оба LSTM слоя.

https://classroom.udacity.com/courses/ud187/lessons/6d543d5c-6b18-4ecf-9f0f-3fd034acd2cc/concepts/c10fb954-25ea-43e3-b22c-21b3e423eb05

Это отличный курс для временных рядов forecasting с использованием neural networks