Keras с иерархическим LSTM - PullRequest
0 голосов
/ 09 июля 2020

У меня возникла проблема с иерархическим lstm в keras. Это хорошо работает, когда данные двухмерные. Когда я изменил его на три измерения, он не работает. Мои данные: (25,10,2). Я хочу построить иерархический lstm, lstm первого уровня преобразует все данные с формой (10,2) в вектор, 25 векторов подаются на второй уровень lstm. Входными данными в первом слое lstm являются (10,2). Я использовал два вложения и умножил их. Я ценю, если кто-нибудь может помочь.

def H_LSTM():
    single_input = Input(shape=(10,2),dtype='int32')
    in_sentence = Lambda(lambda x: single_input[:,:, 0:1], output_shape=(maxlen,))(single_input)
    in_sentence = Reshape((maxlen,), input_shape = (maxlen,1))(in_sentence)
    
    in_drug = Lambda(lambda x: single_input[:, :, 1:1], output_shape=(maxlen,))(single_input)
    in_drug = Reshape((maxlen,), input_shape = (maxlen,1))(in_drug)
    
    embedded_sentence = Embedding(len(word_index) + 1, embedding_dim, weights=[embedding_matrix],
                                input_length=maxlen, trainable=True, mask_zero=False)(in_sentence)    
    embedded_drug = Embedding(len(word_index) + 1, embedding_dim, weights=[embedding_matrix],
                                input_length=maxlen, trainable=True, mask_zero=False)(in_drug)
    embedded_sequences = Multiply()([embedded_sentence, embedded_drug])    
    lstm_sentence = LSTM(100)(embedded_sequences)
    encoded_model = Model(inputs = single_input, outputs = lstm_sentence)


    sequence_input = Input(shape=(25,10,2),dtype='int32')
    seq_encoded = TimeDistributed(encoded_model)(sequence_input)
    seq_encoded = Dropout(0.2)(seq_encoded)
    # Encode entire sentence
    seq_encoded = LSTM(100)(seq_encoded)
    # Prediction
    prediction = Dense(2, activation='softmax')(seq_encoded)
    model = Model(inputs = sequence_input, outputs = prediction)
    model.compile(loss='categorical_crossentropy',
                  optimizer='rmsprop',
                  metrics=['acc'])
    

    return model

Обзор модели:

Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
input_3 (InputLayer)            (None, 10, 2)        0                                            
__________________________________________________________________________________________________
lambda_3 (Lambda)               (None, 10)           0           input_3[0][0]                    
__________________________________________________________________________________________________
lambda_4 (Lambda)               (None, 10)           0           input_3[0][0]                    
__________________________________________________________________________________________________
reshape_3 (Reshape)             (None, 10)           0           lambda_3[0][0]                   
__________________________________________________________________________________________________
reshape_4 (Reshape)             (None, 10)           0           lambda_4[0][0]                   
__________________________________________________________________________________________________
embedding_3 (Embedding)         (None, 10, 128)      4895744     reshape_3[0][0]                  
__________________________________________________________________________________________________
embedding_4 (Embedding)         (None, 10, 128)      4895744     reshape_4[0][0]                  
__________________________________________________________________________________________________
multiply_2 (Multiply)           (None, 10, 128)      0           embedding_3[0][0]                
                                                                 embedding_4[0][0]                
__________________________________________________________________________________________________
lstm_3 (LSTM)                   (None, 100)          91600       multiply_2[0][0]                 
==================================================================================================
Total params: 9,883,088
Trainable params: 9,883,088
Non-trainable params: 0
__________________________________________________________________________________________________
None
Model: "model_4"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_4 (InputLayer)         (None, 25, 10, 2)         0         
_________________________________________________________________
time_distributed_2 (TimeDist (None, 25, 100)           9883088   
_________________________________________________________________
dropout_2 (Dropout)          (None, 25, 100)           0         
_________________________________________________________________
lstm_4 (LSTM)                (None, 100)               80400     
_________________________________________________________________
dense_2 (Dense)              (None, 2)                 202       
=================================================================
Total params: 9,963,690
Trainable params: 9,963,690
Non-trainable params: 0

Сообщение об ошибке:

InvalidArgumentError:  You must feed a value for placeholder tensor 'input_3' with dtype int32 and shape [?,10,2]
     [[node input_3 (defined at D:\Users\Jinhe.Shi\AppData\Local\Continuum\anaconda3\lib\site-packages\keras\backend\tensorflow_backend.py:3009) ]] [Op:__inference_keras_scratch_graph_6214]

Function call stack:
keras_scratch_graph

Обновление: структура показана ниже, разница заключается в отсутствии уровня внимания, и я добавил два вложения в нижний слой lstm.

введите описание изображения здесь

Подходит модель:

Ошибка происходит во время подгонки модели.

model2 = H_LSTM();
print("model fitting - Hierachical network")
model2.fit(X_train, Y_train, nb_epoch=3, batch_size=100, validation_data=(X_test, Y_test))

Входные данные: введите здесь описание изображения

...