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

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

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

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

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

谢谢 !

最佳答案 它似乎有点疯狂,但它似乎工作:而不是创建我将在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_hat和丢失,但是我重量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

点赞