首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多输入预训练模型

多输入预训练模型
EN

Stack Overflow用户
提问于 2018-04-15 14:59:56
回答 1查看 543关注 0票数 1

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

代码语言:javascript
复制
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的权重受到这个新模式的训练的影响。如果这不能达到这个目的,我该怎么做呢?

提前谢谢你!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-15 15:02:38

如果你不冻结预先训练的模型层,它们将在训练期间得到重新计算。这往往不是你想要的。

这是更常见的冻结所有的所有,除了最后几个预先训练的层,然后添加您的层,在顶部和培训,只有这一部分的模型。

在Keras中,可以通过将网络的trainable属性设置为false来冻结网络。

代码语言:javascript
复制
sentence_encoder.trainable = False

若要冻结模型中层的子集,请执行以下操作:

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49843345

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档