В Keras, как я могу получить доступ к векторам Word2Vec (встраивание) для пользовательской функции потери во время обучения - PullRequest
0 голосов
/ 11 марта 2019

У меня есть модель 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 я могу передать y_pred через argmax, такой что K.argmax(y_pred)=[i1,i2,i3,4], целые числа, соответствующие векторам слова vectors[i1], vectors[i2], vectors[i3], vectors[i4].Я хочу сделать некоторые математические расчеты с предсказанными векторами и сравнить их с наземными векторами истины, чтобы отслеживать прогресс (а не функцию потерь).Поэтому мне нужен "полный Keras" способ сделать это.

Если бы y_true был массивом индексов, а word_model - моя модель word2vec, то я мог бы получить массив векторов, просто выполнив word_model.wv.vectors[y_true].Однако преобразование y_true из тензора в numpy кажется очень расточительным, а затем обратно в тензор.Поэтому я не могу заставить что-либо работать в родных кератах, и когда я пытаюсь извлечь тензоры в массивы и работать с ними, я также получаю ошибки.Grrrr ...

Я предполагаю, что должен быть способ извлечь векторы слов из слоя внедрения для y_pred и y_true, но я понятия не имею, как.Кто-нибудь?

1 Ответ

1 голос
/ 12 марта 2019

Простым решением является использование функционального API, и в любое время вы можете вызвать свою пользовательскую функцию потерь.

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_model, чтобы делать то, что вам нужно:

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

Я не проверял код, поэтому может потребоваться небольшая настройка.

...