Keras LSTM и проблема встраивания объединенных массивов - PullRequest
0 голосов
/ 29 мая 2019

Я строю сеть LSTM для классификации по многомерным временным рядам, используя 2 категориальных объекта, для которых я создал слои Embedding в Keras.Модель компилируется, и архитектура отображается ниже с кодом.Я получаю ValueError: all the input array dimensions except for the concatenation axis must match exactly.Это странно для меня, потому что компиляция модели и выходные формы, кажется, совпадают (трехмерное выравнивание, сцепленное вдоль оси = -1).Параметры соответствия модели X представляют собой список из 3 входов (первый массив категориальных переменных, второй массив категориальных переменных и многомерный ввод временных рядов 3-D для LSTM)

Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
input_4 (InputLayer)            (None, 1)            0                                            
__________________________________________________________________________________________________
input_5 (InputLayer)            (None, 1)            0                                            
__________________________________________________________________________________________________
VAR_1   (Embedding)             (None, 46, 5)        50          input_4[0][0]                    
__________________________________________________________________________________________________
VAR_2 (Embedding)               (None, 46, 13)       338         input_5[0][0]                    
__________________________________________________________________________________________________
time_series (InputLayer)        (None, 46, 11)       0                                            
__________________________________________________________________________________________________
concatenate_3 (Concatenate)     (None, 46, 18)       0           VAR_1[0][0]           
                                                                 VAR_2[0][0]               
__________________________________________________________________________________________________
concatenate_4 (Concatenate)     (None, 46, 29)       0           time_series[0][0]                
                                                                 concatenate_3[0][0]              
__________________________________________________________________________________________________
lstm_2 (LSTM)                   (None, 46, 100)      52000       concatenate_4[0][0]              
__________________________________________________________________________________________________
attention_2 (Attention)         (None, 100)          146         lstm_2[0][0]                     
__________________________________________________________________________________________________
dense_2 (Dense)                 (None, 1)            101         attention_2[0][0]                
==================================================================================================
Total params: 52,635
Trainable params: 52,635
Non-trainable params: 0
n_timesteps = 46
n_features = 11

def EmbeddingNet(cat_vars,n_timesteps,n_features,embedding_sizes):
    inputs = []
    embed_layers = []
    for (c, (in_size, out_size)) in zip(cat_vars, embedding_sizes):
        i = Input(shape=(1,))
        o = Embedding(in_size, out_size, input_length=n_timesteps, name=c)(i)
        inputs.append(i)
        embed_layers.append(o)

    embed = Concatenate()(embed_layers)

    time_series_input = Input(batch_shape=(None,n_timesteps,n_features ), name='time_series')

    inputs.append(time_series_input)

    concatenated_inputs = Concatenate(axis=-1)([time_series_input, embed])

    lstm_layer1 = LSTM(units=100,return_sequences=True)(concatenated_inputs)
    attention = Attention()(lstm_layer1)

    output_layer = Dense(1, activation="sigmoid")(attention)

    opt = Adam(lr=0.001)
    model = Model(inputs=inputs, outputs=output_layer)
    model.compile(loss='binary_crossentropy',optimizer=opt,metrics=['accuracy'])
    model.summary()

    return model 
model = EmbeddingNet(cat_vars,n_timesteps,n_features,embedding_sizes)

history = model.fit(x=[x_train_cat_array[0],x_train_cat_array[1],x_train_input], y=y_train_input, batch_size=8, epochs=1, verbose=1, validation_data=([x_val_cat_array[0],x_val_cat_array[1],x_val_input], y_val_input),shuffle=False)

1 Ответ

0 голосов
/ 16 июля 2019

Я пытаюсь к тому же самому.Вы должны объединить по оси 2. Пожалуйста, отметьте ЗДЕСЬ

Дайте мне знать, если это работает в вашем наборе данных, потому что категориальные особенности не дают мне никакой пользы.

...