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