多输入预训练模型

时间:2018-04-15 14:59:56

标签: python tensorflow deep-learning keras pre-trained-model

我目前正在使用Keras + Tensorflow开发一个模型,用于根据STS基准(http://ixa2.si.ehu.es/stswiki/index.php/STSbenchmark)计算句子相似度。我是如何做到的是我首先创建了一个预先训练的模型,将单词嵌入向量列表转换为单个句子嵌入向量。现在,我想要做的是将这个预先训练的模型合并到一个新模型中,该模型使用该模型来转换输入。以下是该新模型的代码。

sentence_encoder = load_model('path/to/model')

input1 = Input(shape=(30, 300), dtype='float32') # 30 words, 300 dim embedding
input2 = Input(shape=(30, 300), dtype='float32')
x1 = sentence_encoder(input1)
x2 = sentence_encoder(input2)
abs_diff = Lambda(lambda x: abs(x[0] - x[1]))([x1, x2])
x = Dense(300, activation='relu', kernel_initializer='he_uniform')(abs_diff)
result = Dense(1, activation='sigmoid')(x)

model = Model([input1, input2], result)
model.compile(loss='binary_crossentropy',
    optimizer='rmsprop',
    metrics=['accuracy'])

model.fit(...)

当我运行它时,会生成一个模型并正确完成。然而,我想知道的是sentence_encoder是否与这个新模型一起训练或者它的权重是否保持不变?如果可能,我希望sentence_encoder的权重受到此新模型培训的影响。如果没有达到这个目的,我该如何去做呢?

提前谢谢!

1 个答案:

答案 0 :(得分:1)

如果您没有冻结预先训练过的模型图层,它们将在训练期间重新计算。这通常不是你想要的。

除了最后几个预训练的图层之外,更常见的是冻结所有图层,然后在顶部添加图层并训练模型的那一部分。

在Keras中,您通过将其trainable属性设置为false来冻结网络:

sentence_encoder.trainable = False

冻结模型中的一部分图层:

sentence_encoder.trainable = True
is_trainable = False
for layer in sentence_encoder.layers:
  if layer.name == 'last layer name':
     is_trainable = True
  if is_trainable:
    layer.trainable = True
  else:
    layer.trainable = False