проблема при использовании LSTM в функциональном режиме - PullRequest
0 голосов
/ 03 мая 2019

При создании слоя LSTM с использованием функционального режима ниже выдается ошибка

ValueError: Input 0 is incompatible with layer lstm_1: expected ndim=3, found ndim=2

Код для воспроизведения вопроса

import keras
from keras.layers import Input, LSTM, Dense
from keras.models import Model

import numpy as np


def build_lstm(lstm_input, hidden_dim=256):
    out = LSTM(hidden_dim, input_shape=(1, 129))(lstm_input)
    return out


def test_lstm():
    lstm_input = Input(shape=(129, ), name='lstm_input')
    out = build_lstm(lstm_input)

    predictions = Dense(256, activation='softmax')(out)
    model = Model(inputs=lstm_input, outputs=predictions)
    model.compile(loss='categorical_crossentropy',
        optimizer='rmsprop',
        metrics=['accuracy'])

    model.summary()

    return  

Журнал ошибок

(NPI_Arch_Keras) C:\workspaces\NPL\project\NPI_Arch_Keras\npi>python npi_lstm_test.py
Using TensorFlow backend.
Traceback (most recent call last):
  File "npi_lstm_test.py", line 35, in <module>
    test_lstm()
  File "npi_lstm_test.py", line 21, in test_lstm
    out = build_lstm(lstm_input)
  File "npi_lstm_test.py", line 15, in build_lstm
    out = LSTM(hidden_dim, input_shape=(1, 129))(lstm_input)
  File "C:\MyProgramFiles\Anaconda3\envs\NPI_Arch_Keras\lib\site-packages\keras\layers\recurrent.py", line 532, in __call__
    return super(RNN, self).__call__(inputs, **kwargs)
  File "C:\MyProgramFiles\Anaconda3\envs\NPI_Arch_Keras\lib\site-packages\keras\engine\base_layer.py", line 414, in __call__
    self.assert_input_compatibility(inputs)
  File "C:\MyProgramFiles\Anaconda3\envs\NPI_Arch_Keras\lib\site-packages\keras\engine\base_layer.py", line 311, in assert_input_compatibility
    str(K.ndim(x)))
ValueError: Input 0 is incompatible with layer lstm_1: expected ndim=3, found ndim=2

Следующая версия кода, которая использует последовательную модель, работает успешно

import keras
from keras.models import Sequential
from keras.layers import LSTM, Dense

import numpy as np


def build_lstm(hidden_dim=256, input_shape=None):
    model = Sequential()
    model.add(LSTM(hidden_dim, return_sequences=True, input_shape=input_shape))
    model.add(LSTM(hidden_dim))
    return model


def test_lstm():
    model = Sequential()
    model.add(build_lstm(input_shape=(1, 129)))
    model.add(Dense(256, activation='softmax'))

    model.compile(loss='categorical_crossentropy',
              optimizer='rmsprop',
              metrics=['accuracy'])

    model.summary()

    return

Журнал успеха

(NPI_Arch_Keras) C:\workspaces\NPL\project\NPI_Arch_Keras\npi>python npi_lstm_working.py
Using TensorFlow backend.
WARNING:tensorflow:From C:\MyProgramFiles\Anaconda3\envs\NPI_Arch_Keras\lib\site-packages\tensorflow\python\framework\op_def_library.py:263: colocate_with (from tensorflow.python.framework.ops) is deprecated and will be removed in a future version.
Instructions for updating:
Colocations handled automatically by placer.
_________________________________________________________________
Layer (type)                 Output Shape              Param #
=================================================================
sequential_2 (Sequential)    (None, 256)               920576
_________________________________________________________________
dense_1 (Dense)              (None, 256)               65792
=================================================================
Total params: 986,368
Trainable params: 986,368
Non-trainable params: 0
_________________________________________________________________

1 Ответ

0 голосов
/ 03 мая 2019

Этот код должен работать в функциональной модели:

in = Input(shape=(1, 129))
lstm_1 = LSTM(256, return_sequences=True)(in)
lstm_2 = LSTM(256)(lstm_1)
out = Dense(256)(lstm_2)

model = Model(in, out)
...