使用Keras的句子级编码

使用Keras的句子级编码,keras,deep-learning,python-3.6,lstm,attention-model,Keras,Deep Learning,Python 3.6,Lstm,Attention Model,我的任务是使用Keras建立文本相似性的监督模型。我的输入是一对长格式文本,目标是0或1。我试图在一个句子中为每个文本编码单词。目的是从文档结构的不同层次获取知识。为此,我首先将文本拆分为一个句子列表,然后标记。我还修正了最大句子长度(文本中的最大句子数)和最大顺序长度(句子中的最大单词数)。以下是我的预处理代码: input_text1 = [sen.split('.') for sen in input_text1] input_text2 = [sen.split('.') for sen

我的任务是使用Keras建立文本相似性的监督模型。我的输入是一对长格式文本,目标是0或1。我试图在一个句子中为每个文本编码单词。目的是从文档结构的不同层次获取知识。为此,我首先将文本拆分为一个句子列表,然后标记。我还修正了最大句子长度(文本中的最大句子数)和最大顺序长度(句子中的最大单词数)。以下是我的预处理代码:

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) 
现在,我在运行模型时遇到以下错误:

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'....

ValueError:模型的输入张量必须来自'keras.layers.Input'。收到:[,在这一行代码中:
model=model([encoder\u input1+encoder\u input2],out)


将其修改为
model=model(输入=[encoder\u input1]+[encoder\u input2],输出=out)

我尝试过修改它,但我得到了相同的错误。因为您的编码器\u input1/2是一个列表,而不是张量。请将编码器\u input1和编码器\u input2修改为输入(形状=(最大句子长度,),名称='desc\u word\u'))或者类似的东西。如果我改变这一点,恐怕接下来的几行会失败。进行列表理解的目的是将每个具有shape=(None,100)的输入列表馈送到嵌入层。这之后是单词_concat1=连接(嵌入_input1,axis=-1)所以bilstm的输入是一个3d张量。或者,如果我做下面的事情,而不是列表理解:编码器输入1=输入(形状=(最大句子长度,最大序列长度),name='desc_单词1')文本嵌入输入1=嵌入(输入dim=max_单词+2,输出dim=emb_dim)(编码器输入1)#形状=(无,100,500,50)我最终得到的是4d张量,我无法将其输入lstm。请告知是否有更好的方法来处理此问题。
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'....