ValueError: форма ввода в Flatten не полностью определена с помощью LSTM переменной длины.

Вот мой код:

    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'])

Я создаю LSTM с переменным вводом через этот вопрос о переполнении стека. Но теперь моя модель говорит ValueError: The shape of the input to "Flatten" is not fully defined (got (None, 20). Как я могу это исправить?

заранее спасибо


person th4t gi    schedule 28.10.2018    source источник
comment
Вы не можете применить Flatten, если количество временных шагов равно unknown во время создания графика — сколько входных единиц будет иметь последний Dense слой?   -  person rvinas    schedule 28.10.2018


Ответы (1)


Вы не можете исправить эту конкретную проблему, потому что вы можете передать вектор переменного размера в слой Dense. Почему? Потому что у него матрица весов фиксированного размера, то есть ядро ​​W.

Вместо этого вам следует обратить внимание на слои, которые могут обрабатывать последовательности переменной длины, такие как RNN. Например, вы можете позволить LSTM изучить представление всей последовательности:

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

Если вам нужна большая емкость в вашей модели, вы можете связать слои RNN, если последний не возвращает последовательности:

lstm_out = Bidirectional(LSTM(10, return_sequences=True))(input)
lstm_out = Bidirectional(LSTM(10))(lstm_out) # this LSTM produces a single vector
person nuric    schedule 28.10.2018