- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在 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]
最相似的概率嵌入层,“猫”也是如此。但损失是如此之大,我必须计算 X
和 X_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_hat
和 loss
,但我将 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/
我是一名优秀的程序员,十分优秀!