首页 文章

预先训练的多输入模型

提问于
浏览
0

我正在开发一个模型,使用 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(...)

当我运行它时,会生成一个模型并正确完成 . 然而,我想知道的是,如果_980168与这个新模型一起训练或者它的重量是否保持不变?如果可能的话,我希望 sentence_encoder 's weights to be influenced by the training of this new model. If this doesn'实现这一目标,我该如何去做呢?

先感谢您!

1 回答

  • 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
    

相关问题