кодирование на уровне предложений с использованием Keras - PullRequest
0 голосов
/ 14 января 2020

Моя задача - создать контролируемую модель для сходства текста с использованием Keras. Мой ввод - это пара длинных текстов, цель - 0 или 1. Я пытаюсь закодировать слова в предложении для каждого текста. Цель состоит в том, чтобы получить знания на разных уровнях структуры документа. Для этого я сначала разбил текст на список предложений, а затем разбил на токены. Я также исправляю max_sentence_length (максимальное количество предложений в тексте) и max_sequence_length (максимальное количество слов в предложении). Ниже приведен мой код для предварительной обработки:

input_text1 = [sen.split('.') for sen in input_text1]
input_text2 = [sen.split('.') for sen in input_text2]

max_words = 20000 (vocab size)
max_sequence_length = 500
max_sentence_length = 100
emb_dim = 50
n_classes = 2
latent_dim = 128
lr = 0.001
epochs = 20
batch_size = 128

tokenizer = Tokenizer(num_words=max_words, filters='!"#$%&()*+,-.:;=?@[\\]^_`{|}~\t\n', lower=True, split=' ', oov_token="UNK")
encoder = LabelEncoder()
tr_sent1, te_sent1, tr_sent2, te_sent2, tr_rel, te_rel = train_test_split(input_text1, input_text2, similarity, test_size=0.2, stratify=similarity)
input_text_sen1 = tr_sent1[:2]
input_text_sen2 = tr_sent2[:2]
tr_rel = tr_rel[:2]
for sen in input_text_sen1 + input_text_sen2:
    tokenizer.fit_on_texts(sen)
encoder.fit(tr_rel)
tokenizer.word_index = {e: i for e, i in tokenizer.word_index.items() if i <= max_words}
tokenizer.word_index[tokenizer.oov_token] = max_words + 1
seqs1 = []
for sen in input_text_sen1:
    tmp = tokenizer.texts_to_sequences(sen)
    seqs1.append(tmp)

# to fix the number of sentences

seqs1_fixed = []
for sen in seqs1:
    sen = sen[:max_sentence_length]
    seqs1_fixed.append(sen)
seqs1_fixed = [pad_sequences(sen, maxlen=max_sequence_length,
                             value=0, padding='post', truncating='post') for sen in seqs1_fixed]

seqs2 = []
for sen in input_text_sen2:
    tmp = tokenizer.texts_to_sequences(sen)
    seqs2.append(tmp)

seqs2_fixed = []
for sen in seqs2:
    sen = sen[:max_sentence_length]
    seqs2_fixed.append(sen)

seqs2_fixed = [pad_sequences(sen, maxlen=max_sequence_length,
                             value=0, padding='post', truncating='post') for sen in seqs2_fixed]
categorical_y = encoder.transform(tr_rel) 

Ниже приведен код для построения модели:

bilstm = Bidirectional(LSTM(units=latent_dim, return_sequences=True, dropout=0.2, recurrent_dropout=0.2))

encoder_input1 = [Input(shape=(max_sentence_length,), name='desc_word_' + str(i + 1)) for i in range(max_sequence_length)] # list with each shape=(None, 100)
text_embedding_input1 = Embedding(input_dim=max_words+2, output_dim=emb_dim, input_length=max_sentence_length)  # list with each shape=(None, 100, 50)
embedding_input1 = [text_embedding_input1(inp) for inp in encoder_input1]
words_concat1 = concatenate(embedding_input1, axis=-1) # shape=(None, 100, 25000)
bilstm_out1 = bilstm(words_concat1) # shape=(None, 100, 256)

encoder_input2 = [Input(shape=(max_sentence_length, ), name='desc_word_' + str(i + 1)) for i in range(max_sequence_length)]
text_embedding_input2 = Embedding(input_dim=max_words+2, output_dim=emb_dim, input_length=max_sentence_length)
embedding_input2 = [text_embedding_input2(inp) for inp in encoder_input2]
words_concat2 = concatenate(embedding_input2, axis=-1)
bilstm_out2 = bilstm(words_concat2)

x1 = attention()(bilstm_out1) # shape=(None, 256)
x1 = Dropout(0.2)(x1)
x2 = attention()(bilstm_out2) # shape=(None, 256)
x2 = Dropout(0.2)(x2)
x = concatenate([x1, x2]) # shape=(None, 512)
out = Dense(units=n_classes, activation="softmax", kernel_regularizer=l2(0.01), bias_regularizer=l2(0.01))(x) # shape=(None, 2)
model = Model([encoder_input1 + encoder_input2], out)

Прямо сейчас я получаю ошибку ниже при работе модели:

ValueError: Input tensors to a Model must come from `keras.layers.Input`. Received: [<tf.Tensor 'desc_word_1_16:0' shape=(None, 100) dtype=float32>, <tf.Tensor 'desc_word_2_16:0' shape=(None, 100) dtype=float32>, <tf.Tensor 'desc_word_3_16:0'....

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

1 Ответ

0 голосов
/ 14 января 2020

В этой строке кода: model = Model([encoder_input1 + encoder_input2], out),

измените его на model = Model(inputs=[encoder_input1] + [encoder_input2], outputs=out)

...