Как сложить Convolutional Layer и LSTM, используя Tensorflow2.0 alpha? - PullRequest
2 голосов
/ 18 апреля 2019

Я пытаюсь реализовать нейронную сеть для задачи НЛП со сверточным уровнем, за которым следует слой LSTM.В настоящее время я экспериментирую с новым Tensorflow 2.0, чтобы сделать это.Однако при построении модели я столкнулся с ошибкой, которую не смог понять.

# Input shape of training and validation set
(1000, 1, 512), (500, 1, 512)

Модель

model = keras.Sequential()
model.add(keras.layers.InputLayer(input_shape=(None, 512)))
model.add(keras.layers.Conv1D(128, 1, activation="relu"))
model.add(keras.layers.MaxPooling1D((2)))
model.add(keras.layers.LSTM(64, activation="tanh"))
model.add(keras.layers.Dense(6))
model.add(keras.layers.Activation("softmax"))

Ошибка

InvalidArgumentError: Tried to stack elements of an empty list with non-fully-defined element_shape: [?,64]
 [[{{node unified_lstm_16/TensorArrayV2Stack/TensorListStack}}]] [Op:__inference_keras_scratch_graph_26641]

Сначала я попытался проверить, есть ли какие-либо проблемы, связанные с реализацией слоя Conv1D со слоем LSTM.Я нашел этот пост , в котором предлагалось изменить форму слоя между сверточным слоем и слоем lstm.Но это все равно не сработало, и вместо этого я получил другую ошибку. Этот пост кажется похожим, но он не использует Tensorflow 2.0 и пока не отвечает.Я также нашел этот пост, который имеет такое же намерение укладывать сверточный и нижний слои.Но он использует Conv2D вместо Conv1D. В этом посте также предлагается использовать измененный вывод сверточного слоя со встроенным слоем под названием Reshape.Тем не менее, я все еще получаю ту же ошибку.

Я также пытался указать input_shape в слое LSTM.

model = keras.Sequential()
model.add(keras.layers.InputLayer(input_shape=(None, 512)))
model.add(keras.layers.Conv1D(128, 1, activation="relu"))
model.add(keras.layers.MaxPooling1D((2)))
model.add(keras.layers.LSTM(64, activation="tanh", input_shape=(None, 64)))
model.add(keras.layers.Dense(6))
model.add(keras.layers.Activation("softmax"))

И в конце концов я все еще получил ту же ошибку.

Я не уверен, понимаю ли я, как сложить одномерный сверточный слой и слой lstm.Я знаю, что TF2.0 по-прежнему является Альфой, но кто-то может указать, что мне не хватало?Заранее спасибо

Ответы [ 2 ]

3 голосов
/ 18 апреля 2019

Проблема в размерности. Ваша особенность имеет форму [..., 1, 512]; следовательно, MaxPooling1D pooling_size 2 больше 1, вызывая проблему.

Добавление padding="same" решит проблему.

model = tf.keras.Sequential()
model.add(tf.keras.layers.InputLayer(input_shape=(None, 512)))
model.add(tf.keras.layers.Conv1D(128, 1, activation="relu"))
model.add(tf.keras.layers.MaxPooling1D(2, padding="same"))

model.add(tf.keras.layers.LSTM(64, activation="tanh"))
model.add(tf.keras.layers.Flatten())
model.add(tf.keras.layers.Dense(6))
model.add(tf.keras.layers.Activation("softmax"))
1 голос
/ 18 апреля 2019

padding = "same" должен решить вашу проблему.

Измените строку ниже:

model.add(tf.keras.layers.MaxPooling1D(2, padding="same"))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...