ValueError: вход 0 несовместим со слоем lstm_1: ожидаемый ndim = 3, найденный ndim = 2 [керас] - PullRequest
0 голосов
/ 09 октября 2018

Я получил ошибку: ValueError: Input 0 is incompatible with layer lstm_1: expected ndim=3, found ndim=2 со следующим кодом:

def make_model():
  model = Sequential()      

  model.add(Conv2D(20,(5,5), input_shape = (24,48,30), activation = "relu", strides = 1, padding = "valid"))
  model.add(MaxPooling2D(pool_size=(2,2)))        
  model.add(Conv2D(50, (5,5), use_bias = 50))    
  model.add(MaxPooling2D(pool_size=(2,2)))    
  model.add(Flatten())
  model.add(Dense(20, activation = "relu"))
  model.add(LSTM(50, activation="relu", return_sequences=True))

  return model

Мой ввод - 30 матриц размером 24 * 48 каждая.

1 Ответ

0 голосов
/ 09 октября 2018

Проблема заключается в том, что после последнего плотного слоя (перед слоем lstm) выходная форма равна (?, 20), а слой lstm ожидает 3D-тензор, а не 2D. Так что вы можете расширить размеры вЧтобы добавить еще один перед подачей в слой lstm.

Размеры можно расширить с помощью tf.expand_dims (при условии, что вы используете тензор потока в качестве бэкэнда) tf expand

input_layer = Input((30,24,48))

model = Conv2D(20,(5,5), input_shape = (30,24,48), activation = "relu", strides = 1, padding = "valid")(input_layer)
model = MaxPooling2D(pool_size=(2,2))(model)        
model = Conv2D(50, (5,5), use_bias = 50)(model)    
model = MaxPooling2D(pool_size=(2,2))(model)  
model = Flatten()(model)
model = Dense(20, activation = "relu")(model)
model = tf.expand_dims(model, axis=-1)
model = LSTM(50, activation="relu", return_sequences=True)(model)

(Я не использовал последовательный режим, я использую функциональный API , поскольку он более гибкий)

Если вы хотите использовать последовательную модель:

    model = Sequential()      

    model.add(Conv2D(20,(5,5), input_shape = (30, 24, 48), activation = "relu", strides = 1, padding = "valid"))
    model.add(MaxPooling2D(pool_size=(2,2)))        
    model.add(Conv2D(50, (5,5), use_bias = 50))    
    model.add(MaxPooling2D(pool_size=(2,2)))    
    model.add(Flatten())
    model.add(Dense(20, activation = "relu"))
    model.add(Lambda(lambda x: tf.expand_dims(model.output, axis=-1)))
    model.add(LSTM(50, activation="relu", return_sequences=True))

вынеобходимо использовать расширенные размеры внутри Лямбда

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