多输入预训练模型
Pre-trained Model on Multiple Inputs
我目前正在开发一个模型,使用 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
的权重受到这个新模型训练的影响。如果这不能实现,我该怎么做?
提前致谢!
如果您不冻结预训练模型层,它们将在训练期间重新计算。这通常不是你想要的。
更常见的做法是冻结除了最后几个预训练层之外的所有层,然后将您的层添加到顶部并仅训练模型的那部分。
在 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
我目前正在开发一个模型,使用 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
的权重受到这个新模型训练的影响。如果这不能实现,我该怎么做?
提前致谢!
如果您不冻结预训练模型层,它们将在训练期间重新计算。这通常不是你想要的。
更常见的做法是冻结除了最后几个预训练层之外的所有层,然后将您的层添加到顶部并仅训练模型的那部分。
在 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