如何在keras中加载预训练的单词嵌入并输出不同的类

时间:2018-11-12 16:55:54

标签: python keras lstm word-embedding

我想比较两个LSTM,一个是Wikipedia数据训练的,另一个是我自己的。设计第一个模型时出现问题。我定义了两个词嵌入词汇,一个仅基于维基百科数据构建,另一个也基于我的语料库进行训练。我想定义第一个具有嵌入层(从Wikipedia加载预先训练的权重)的LSTM,但是输出应该与其词汇量(10000)不同,实际上我想输出的类多达包含在其他词汇表中的词汇(50000)。这就是我现在拥有的:

model = Sequential()
model.add(Embedding(vocab_size_wikipedia, embedding_size, input_length=55, weights=[pretrained_weights_wikipedia])) 
model.add(Bidirectional(LSTM(units=embedding_size)))
model.add(Dense(vocab_size, activation='softmax'))
model.compile(loss='categorical_crossentropy',
          optimizer = RMSprop(lr=0.0005),
          metrics=['accuracy'])

model.fit(np.array(X_train), np.array(y_train), epochs=10, validation_data=(np.array(X_val), np.array(y_val)))

这是我的变量和形状:

shape of pretrained_weights_wikipedia = (10000, 100)
vocab_size = 50000
embedding_size = 100
vocab_size_wikipedia = 10000

X_train.shape() = (1600,55)
y_train.shape() = (1600,50000)
X_train.shape() = (400,55)
X_train.shape() = (400,50000)
X_train.shape() = (200,55)
X_train.shape() = (200,50000) #the labels are padded 

谢谢您的帮助!

1 个答案:

答案 0 :(得分:0)

您要构建一个模型,在该模型中,您需要具有不同词汇量(此处为10000)的预训练权重,并将其微调为具有不同词汇量(此处为50000)的自己的语料库。

由于问题是对称的,因此应重用编码第一句话的机制(权重和全部)来编码第二句话。在这里,我们使用共享层对输入进行编码。

单击here,以获取有关shared layers的更多信息。

input = Input(shape=55)

emb1 = Embedding(vocab_size_wikipedia, embedding_size, weights=pretrained_weights_wikipedia, trainable=False)(input)
emb2 = Embedding(50000, embedding_size)(input)

bi = Bidirectional(LSTM(embedding_size))

x1 = bi(emb1)
x2 = bi(emb2)

dense = Dense(vocab_size, activation='softmax')

op1 = dense(x1)
op2 = dense(x2)

model = Model(inputs=[input1, input2], outputs=[op1, op2])
model.compile(loss='categorical_crossentropy',
          optimizer = RMSprop(lr=0.0005),
          metrics=['accuracy'])
model.summary()