У меня есть модель 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, но я понятия не имею, как.Кто-нибудь?