首页 文章

Keras:如何在损失函数中使用图层的权重?

提问于
浏览
4

我正在keras中实现自定义丢失功能 . 该模型是 autoencoder . 第一层是嵌入层,它将大小为 (batch_size, sentence_length) 的输入嵌入到 (batch_size, sentence_length, embedding_dimension) 中 . 然后,模型将嵌入压缩为特定维度的向量,最后必须重建嵌入 (batch_size, sentence_lenght, embedding_dimension) .

但是嵌入层是可训练的,并且损失必须使用嵌入层的权重(我必须总结我的词汇表的所有单词嵌入) .

例如,如果我想训练玩具例子:"the cat" . sentence_length is 2 并假设 embedding_dimension is 10vocabulary size is 50 ,因此嵌入矩阵的形状为 (50,10) . 嵌入层的输出 X 的形状为 (1,2,10) . 然后它传入模型,输出 X_hat ,形状 (1,2,10) . 必须训练模型以最大化表示'the'的向量 X_hat[0] 与嵌入层中表示'the'的向量 X[0] 最相似的概率,对于'cat'也是如此 . 但是我必须计算 XX_hat 之间的余弦相似度,通过 X_hat 的余弦相似度之和以及嵌入矩阵中的每个嵌入(50,因为词汇量大小为50)归一化,这是列的嵌入层的权重 .

但是,如何在培训过程的每次迭代中访问嵌入层中的权重?

谢谢 !

1 回答

  • 1

    它似乎有点疯狂,但它似乎工作:而不是创建我将在model.compile中传递的自定义丢失函数,网络计算我用Lambda调用的函数中的损失(来自arxiv.org/pdf/1708.04729.pdf的公式1):

    loss = Lambda(lambda x: similarity(x[0], x[1], x[2]))([X_hat, X, embedding_matrix])
    

    并且网络有两个输出: X_hatloss ,但我重量 X_hat 有0重量和损失以具有所有重量:

    model = Model(input_sequence, [X_hat, loss])
    model.compile(loss=mean_squared_error,
                  optimizer=optimizer,
                  loss_weights=[0., 1.])
    

    当我训练模型时:

    for i in range(epochs):
        for j in range(num_data):
            input_embedding = model.layers[1].get_weights()[0][[data[j:j+1]]]
            y = [input_embedding, 0] #The embedding of the input
            model.fit(data[j:j+1], y, batch_size=1, ...)
    

    这样,模型被训练为朝向0,当我想使用训练模型的预测时,我使用第一个输出,即重建 X_hat

相关问题