Предсказание текста с помощью word и character LSTM

#python #tensorflow #lstm

#python #тензорный поток #lstm

Вопрос:

Я пытаюсь реализовать LSTM с встраиванием символов и слов, как показано здесь, за исключением того, что моя проблема не в NER, а в простом предсказании текста. Прямо сейчас я получаю эту ошибку:

    ValueError: Shapes (None, 135) and (None, 10, 135) are incompatible
 

Это краткое изложение моей модели:

 Model: "model_13"
__________________________________________________________________________________________________
Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
input_34 (InputLayer)           [(None, 10, 30)]     0                                            
__________________________________________________________________________________________________
input_33 (InputLayer)           [(None, 10)]         0                                            
__________________________________________________________________________________________________
time_distributed_43 (TimeDistri (None, 10, 30, 20)   2380        input_34[0][0]                   
__________________________________________________________________________________________________
embedding_16 (Embedding)        (None, 10, 128)      26887296    input_33[0][0]                   
__________________________________________________________________________________________________
time_distributed_44 (TimeDistri (None, 10, 20)       3280        time_distributed_43[0][0]        
__________________________________________________________________________________________________
concatenate_14 (Concatenate)    (None, 10, 148)      0           embedding_16[8][0]               
                                                                 time_distributed_44[0][0]        
__________________________________________________________________________________________________
spatial_dropout1d_14 (SpatialDr (None, 10, 148)      0           concatenate_14[0][0]             
__________________________________________________________________________________________________
bidirectional_14 (Bidirectional (None, 10, 100)      79600       spatial_dropout1d_14[0][0]       
__________________________________________________________________________________________________
time_distributed_45 (TimeDistri (None, 10, 135)      13635       bidirectional_14[0][0]           
==================================================================================================
Total params: 26,986,191
Trainable params: 98,895
Non-trainable params: 26,887,296
__________________________________________________________________________________________________

 

Мои входные X_word данные, X_char и Y . X_word представляет собой список закодированных слов. 10 слов в предложении (2770, 10) и X.word[0] выглядит так:

 array([[ 16871,      298,      0,      0,      0,      0,      0,      0,
             0,      0]])
 

И это мягкое предложение из двух слов.

Мой X_char — это список символов для этих слов:

 array([[  7, 101,  16, 101,   0,   0,   0,   0,   0,   0,   0,   0,   0,
          0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
          0,   0,   0,   0],
       [ 56, 102,  16,  34, 102,  61,   6, 102,  93,   0,   0,   0,   0,
          0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
          0,   0,   0,   0],
       [  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
          0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
          0,   0,   0,   0],
       [  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
          0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
          0,   0,   0,   0],
       [  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
          0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
          0,   0,   0,   0],
       [  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
          0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
          0,   0,   0,   0],
       [  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
          0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
          0,   0,   0,   0],
       [  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
          0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
          0,   0,   0,   0],
       [  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
          0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
          0,   0,   0,   0],
       [  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
          0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
          0,   0,   0,   0]])
 

X_char имеет форму (2770, 10, 30) .

У меня 135 меток, поэтому Y имеет форму (2770,135) , и я подхожу ко всему вот так:

 history = model.fit([X_word_tr,
                    (np.array(X_char_tr)).astype('float32').reshape((len(X_char_tr), max_len, max_len_char))],
                    np.array(to_categorical(y_tr)), epochs=10, verbose=1)
 

Я не могу не думать, что моя логика где-то ошибочна.

Ответ №1:

Если вы определили модель, как в руководстве, которое вы связали (которое вы должны включить в сообщение), это потому, что она настроена на возврат последовательности, поэтому она возвращает следующие 10 символов. Вам нужно установить return_sequences=False так, чтобы он возвращал единственное значение, и удалить последний TimeDistributed слой, который обтекает последний Dense слой.

 main_lstm = tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(units=50, return_sequences=False, 
                                                               recurrent_dropout=0.6))(x)
out = tf.keras.layers.Dense(n_tags   1, activation="sigmoid")(main_lstm)
 

В сводке вы увидите, что он возвращает одно значение, и поэтому его можно сравнить с вашими метками:

 _______________________________________________________________________________________________
dense_5 (Dense)                 (None, 135)          13635       bidirectional_5[0][0]            
===============================================================================================
 

Комментарии:

1. теперь я понимаю это: InvalidArgumentError: indices[310,0] = 119 is not in [0, 119) [[node model_3/time_distributed_12/embedding_7/embedding_lookup (defined at <ipython-input-64-51f6ad92087d>:3) ]] [Op:__inference_train_function_28785] Errors may have originated from an input operation. Input Source operations connected to node model_3/time_distributed_12/embedding_7/embedding_lookup: model_3/time_distributed_12/embedding_7/embedding_lookup/24179 Function call stack: train_function