Python 在Keras中,如何在培训期间访问Word2Vec(嵌入)向量以实现自定义损失函数

Python 在Keras中,如何在培训期间访问Word2Vec(嵌入)向量以实现自定义损失函数,python,tensorflow,keras,word2vec,Python,Tensorflow,Keras,Word2vec,我有一个keras RNN模型,就像这个模型一样,使用预先训练好的Word2Vec权重 model = Sequential() model.add(L.Embedding(input_dim=vocab_size, output_dim=embedding_size, input_length=max_phrase_length, weights=[pretrained_weights],trainable

我有一个keras RNN模型,就像这个模型一样,使用预先训练好的Word2Vec权重

model = Sequential()
model.add(L.Embedding(input_dim=vocab_size, output_dim=embedding_size,
                      input_length=max_phrase_length,
                      weights=[pretrained_weights],trainable=False))
model.add((L.LSTM(units=rnn_units)))
model.add((L.Dense(vocab_size,activation='sigmoid')))
adam=Adam(lr)
model.compile(optimizer=adam, loss='cosine_proximity',
             metrics=['cosine_proximity'])
在培训期间,我想创建一个自定义损失函数来比较与预测和真实整数索引相关联的预测和真实字向量

def custom_loss(y_true,y_pred):
    A=extract_the_word_vectors_for_the_indices(y_true)
    B=extract_the_word_vectors_for_the_indices(y_pred)
    return some keras backend function of A and B
例如,假设我的批量大小为4。然后从model.fit,我可以通过一个
argmax
传递
y\u pred
,这样
K.argmax(y\u pred)=[i1,i2,i3,4]
,对应于单词向量
向量[i1],向量[i2],向量[i3],向量[i4]
的整数。我想用预测向量做一些数学运算,并将它们与地面真值向量进行比较,作为监控进度的一种方法(而不是作为损失函数)。所以我需要一个“Keras full”的方法来实现这一点

如果
y\u-true
是一个索引数组,而
word\u-model
是我的word2vec模型,那么我可以通过执行
word\u-model.wv.vectors[y\u-true]
得到一个向量数组。然而,将
y\u true
从张量转换为numpy,然后再转换回张量似乎是非常浪费的。所以我似乎无法在本地keras中使用任何东西,当我试图提取numpy数组的张量并使用这些张量时,我也会出错。Grrrr


我想一定有办法从嵌入层提取y_pred和y_true的词向量,但我不知道如何提取。有人吗?

一个简单的解决方案是使用函数式api,您可以随时调用自定义的loss函数

from keras.models import Model
from keras.layers import Input, Embedding, LSTM, Dense
from keras.optimizers import Adam

model_input = Input((max_phrase_length, vocab_size))
embedding_layer = Embedding(input_dim=vocab_size, output_dim=embedding_size,
                      input_length=max_phrase_length,
                      weights=[pretrained_weights],trainable=False)

x = embedding_layer(model_input)
x = LSTM(units=rnn_units)(x)
x = Dense(units=vocab_size, activation='sigmoid')(x)

orignal_model = Model(inputs=model_input, outputs=x)
orignal_model.compile(optimizer=Adam(lr),
                      loss='cosine_proximity',
                      metrics=['cosine_proximity'])

embedding_model = Model(inputs=model_input, outputs=embedding_layer(model_input))
现在,您可以使用embedding_模型来完成所需的工作:

def custom_loss(y_true,y_pred, embedding_model):
    A = embedding_model.predict(np.argmax(y_true))
    B = embedding_model.predict(np.argmax(y_pred))
    return some keras backend function of A and B

我还没有检查代码,所以可能需要进行一些调整。

这种方法对您有效吗?恐怕不行。我需要特别提取预测和真值张量中每个整数对应的字向量。单词向量在嵌入层或word2vec模型中。B=为y_pred中的索引提取单词向量的确切含义是什么?您的网络输出是密集的,以sigmoid作为激活的vocab大小,显然不会是1-hot。如果我理解正确,您希望获取最可能单词的索引,然后使用匹配单词嵌入进行一些计算。这需要tf.argmax/K.argmax,这是不可微的。如果我错了,请纠正我。伊恩,我不是用这个来表示损失函数,只是一个我可以在拟合过程中观察的指标。至于第一个问题,我对问题进行了一些编辑,以回答这个问题。我希望能够在预测和地面真值词向量之间做一些数学运算,除了看看交叉熵或准确度。这非常聪明。谢谢,我要试一试!如果你觉得答案有用,请接受。我还没有机会尝试-/