2

Here's my code:

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

    input = Input(shape=(None, 100))
    lstm_out = Bidirectional(LSTM(10, return_sequences=True))(input)
    something = Flatten()(lstm_out)
    output = Dense(22, activation='softmax')(something)

    model = Model(inputs=input, outputs=output)
    model.compile(loss='categorical_crossentropy', optimizer='adadelta', metrics=['accuracy'])

I'm building an LSTM with variable input through this stackoverflow question. But now my model is saying ValueError: The shape of the input to "Flatten" is not fully defined (got (None, 20). How can I fix this?

Thanks in advance

th4t gi
  • 139
  • 2
  • 5
  • You can't apply `Flatten` if the number of timesteps is `unknown` at graph creation time - how many input units would the last `Dense` layer have? – rvinas Oct 28 '18 at 09:42

1 Answers1

1

You can't fix this particular problem because you can pass a variable size vector to a Dense layer. Why? Because it has a fixed size weights matrix, i.e. the kernel W.

You should instead look at layers that can handle variable length sequences such as RNNs. For example you can let the LSTM learn a representation over the entire sequence:

input = Input(shape=(None, 100))
lstm_out = Bidirectional(LSTM(10))(input) # the LSTM produces a single fixed size vector
output = Dense(22, activation='softmax')(lstm_out) # Dense classifies it

If you want more capacity in your model you can chain RNN layers so long as the last one doesn't return sequences:

lstm_out = Bidirectional(LSTM(10, return_sequences=True))(input)
lstm_out = Bidirectional(LSTM(10))(lstm_out) # this LSTM produces a single vector
nuric
  • 11,027
  • 3
  • 27
  • 42