CNN-LSTM с дополнительными данными: но я получил ошибку :( - PullRequest
0 голосов
/ 04 апреля 2020

Я пытаюсь построить модель CNN + RNN для своего проекта, но я получил ошибку после объединения слоев, чтобы передать ее в качестве входных данных для LSTM.

Модель, которую я пытаюсь построить: МОДЕЛЬ

Ошибка:

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

со следующим кодом:

kernel_size1 = 3
kernel_size2 = 5
dropout = 0.2
learning_rate = 0.001
weights = initializers.TruncatedNormal(mean=0.0, stddev=0.1, seed=2)
nb_filter = 64
rnn_output_size = 128
hidden_dims = 512
wider = True
deeper = True
batch_size=128


def build_model():
    input_news = Input(shape=(max_daily_length,), name='News_Input')
    embedding = Embedding(input_dim=vocabulary_size, # size of the vocabulary
                          output_dim=embedding_dimension,
                          weights=[word_vectors],
                          trainable=False,
                          input_length=max_daily_length)(input_news)    

    input_price = Input(shape=(len(selected_features),),
                        name='Price_Input')    

    x = Dropout(dropout)(embedding)
    x = Convolution1D(filters=nb_filter,
                      kernel_size=kernel_size1,
                      padding='same',
                      activation='relu')(x)
    x = MaxPooling1D(pool_size=2)(x)
    x = Convolution1D(filters=nb_filter,
                      kernel_size=kernel_size2,
                      padding='same',
                      activation='relu')(x)
    x = MaxPooling1D(pool_size=2)(x)
    x = Flatten(name='flate_0')(x)
    x = Dense(units=1024, 
              activation='relu',
              name='dense_0')(x)
    x = Dense(units=1024, 
              activation='relu',
              name='dense_1')(x) 

    model_concat = concatenate(inputs=[input_price, input_news], axis=-1)

    lstm = LSTM(rnn_output_size,
                activation=None,
                kernel_initializer=weights,
                batch_size=batch_size,
                dropout=dropout)(model_concat)

    model_concat = Dense(hidden_dims, kernel_initializer=weights)(lstm)
    model_concat = Dropout(dropout)(model_concat)

    if deeper == True:    
        model_concat = Dense(hidden_dims//2, kernel_initializer=weights)(model_concat)
        model_concat = Dropout(dropout)(model_concat)

    model_output = Dense(1, kernel_initializer=weights, name='output')(model_concat)

    model = Model(inputs=[input_news, input_price], outputs=[model_output])
...