#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