gpt4 book ai didi

喀拉斯 : How to use weights of a layer in loss function?

转载 作者:行者123 更新时间:2023-12-02 05:46:50 26 4
gpt4 key购买 nike

我正在 keras 中实现自定义损失函数。该模型是一个自动编码器。第一层是嵌入层,它将大小为(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] 最相似的概率嵌入层,“猫”也是如此。但损失是如此之大,我必须计算 XX_hat 之间的余弦相似度,并通过 X_hat 和每个的余弦相似度之和进行归一化。嵌入矩阵中的 embedding (50,因为词汇量为 50),它们是嵌入层权重的列。

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

谢谢!

最佳答案

这看起来有点疯狂,但似乎有效:网络不是创建我在 model.compile 中传递的自定义损失函数,而是在我调用的函数中计算损失(来自 arxiv.org/pdf/1708.04729.pdf 的方程 1)与 Lambda :

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

网络有两个输出:X_hatloss,但我将 X_hat 的权重设为 0,将 loss 设为所有权重:

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, ...)

这样,模型经过训练,loss 趋于 0,当我想使用经过训练的模型的预测时,我使用第一个输出,即重建 X_hat

关于喀拉斯 : How to use weights of a layer in loss function?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47336721/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com