【问题标题】:Pre-trained Model on Multiple Inputs多输入预训练模型
【发布时间】:2018-09-25 08:51:07
【问题描述】:

我目前正在开发一个使用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 的权重受到这个新模型的训练的影响。如果这没有实现,我该怎么做呢?

提前谢谢你!

【问题讨论】:

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


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2017-08-19
      • 1970-01-01
      • 1970-01-01
      • 2019-08-15
      • 2021-07-03
      • 1970-01-01
      • 1970-01-01
      • 2019-10-20
      • 2017-10-25
      相关资源
      最近更新 更多