我目前正在开发一个使用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的权重受到这个新模式的训练的影响。如果这不能达到这个目的,我该怎么做呢?
提前谢谢你!
发布于 2018-04-15 15:02:38
如果你不冻结预先训练的模型层,它们将在训练期间得到重新计算。这往往不是你想要的。
这是更常见的冻结所有的所有,除了最后几个预先训练的层,然后添加您的层,在顶部和培训,只有这一部分的模型。
在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 = Falsehttps://stackoverflow.com/questions/49843345
复制相似问题