我正在进行语言建模,词汇量很大。所以我想使用tensorflow中的sampled_softmax_loss。问题是,权重和偏见这些是sampled_softmax_loss函数的参数似乎不可训练(它们的值在训练后不会改变)
所以我想我应该将它们添加到keras Model自动构建的计算图形中,但是我花了很多时间并且仍然没有找到合适的方法。
所以,再一次。我希望将外部可训练的tf.Variables添加到keras计算图。有谁知道这样做的方法?
我的模特(头部和尾部)
input_sentence = Input(shape=(INPUT_LENGTH,), dtype='int32')
words = Embedding(embedding_matrix.shape[0], embedding_matrix.shape[1],
weights=[embedding_matrix], trainable=True)(input_sentence)
...
context = Dense(256, activation='tanh')(context)
model = Model(inputs=input_sentence, outputs=context, name=name)
损失
def softmax_fine_loss(labels, logits, transposed_W=None, b=None):
res = tf.map_fn(lambda (__labels, __logits): tf.nn.sampled_softmax_loss(transposed_W, b, __labels, __logits,
num_sampled=1000, num_classes=OUTPUT_COUNT+1),
(labels, logits), dtype=tf.float32)
return res
loss = lambda labels, logits: softmax_fine_loss(labels, logits, transposed_W=transposed_W, b=b)
model_truncated.compile(optimizer=optimizer, loss=loss, sample_weight_mode='temporal')
答案 0 :(得分:6)
我终于找到了解决方法
让我们说我们需要用我们的模型训练权重 W 和偏见 b 。
因此,解决方法是将它们添加到我们模型的可训练层之一。
model.layers[-1].trainable_weights.extend([W, b])
当我们可以编译模型时
model.compile(...)
将变量添加到可训练层非常重要,例如我已尝试使用Sequential模型,并且将[W,b]添加到Activation层不会使它们实际上可训练