mat*_*112 5 embedding loss keras tensor
我在keras中实现自定义损失功能。该模型是autoencoder。所述第一层是一个嵌入层,其嵌入尺寸的输入(batch_size, sentence_length)到(batch_size, sentence_length, embedding_dimension)。然后,模型将嵌入压缩为一定维数的向量,最后必须重建嵌入(batch_size, sentence_lenght, embedding_dimension)。
但是嵌入层是可训练的,并且损失必须使用嵌入层的权重(我必须对词汇表的所有词嵌入进行求和)。
例如,如果我想训练玩具示例:“猫”。的sentence_length is 2并假设embedding_dimension is 10和vocabulary size is 50,所以嵌入矩阵具有形状(50,10)。嵌入层的输出X为shape (1,2,10)。然后,它传递到模型中,并且输出X_hat也具有形状(1,2,10)。必须对模型进行训练,以最大程度地提高在嵌入层中表示“ the” X_hat[0]的矢量与X[0]表示“ the” 的矢量最相似的可能性,而对于“ cat”也一样。但是损失是如此之大,以至于我必须计算X和之间的余弦相似度,并X_hat通过将的余弦相似度之和归一化X_hat 以及嵌入矩阵中的每个嵌入(由于词汇量为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])
Run Code Online (Sandbox Code Playgroud)
网络有两个输出:X_hat和loss,但我权重X_hat为 0 权重,损失为所有权重:
model = Model(input_sequence, [X_hat, loss])
model.compile(loss=mean_squared_error,
optimizer=optimizer,
loss_weights=[0., 1.])
Run Code Online (Sandbox Code Playgroud)
当我训练模型时:
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, ...)
Run Code Online (Sandbox Code Playgroud)
这样,模型被训练成趋于loss0,当我想使用训练后的模型的预测时,我使用第一个输出,即重建X_hat