J'ai un réseau lstm dans tflearn qui prédit le mot suivant dans une séquence donnée dans un contexte de mots précédents. Les mots sont introduits dans le réseau en tant qu'indices d'un vocabulaire de taille donnée et sont sortis en classes binaires, par exemple:tflearn fonction de perte personnalisée pour la similitude de cosinus
contexte: [45, 243, 1, 1906, 4, 2, 0, 0, 0 , 0]
étiquette: [0,0,0 ....... 1,0,0, 0,0,0 ......] (longueur de VOCAB_SIZE)
Cependant , le modèle apprend à prédire presque le même mot à chaque fois parce que j'utilise la fonction objective "categorical_crossentropy" dans la couche de régression.
Je voudrais essayer d'évaluer la perte basée sur les plongées de mots (word2vec), que j'ai déjà générées pour l'ensemble de données. Ainsi, le modèle prédisant «bonjour» où la vérité au sol est «salut» aurait une perte beaucoup plus faible que la prévision de «pizza». Le plan consiste à calculer le cosinus entre deux vecteurs d'inclusion pour obtenir la "similarité" entre les mots.
J'ajoute cette fonction de perte personnalisée au fichier objectifs.py dans l'installation de tflearn, mais j'ai rencontré un roadblock lorsque j'ai essayé de convertir les prédictions en vecteurs d'incorporation.
tflearn/objectives.py:
vocab = np.loadtxt('/home/vocab.txt',dtype='str')
embedding_model = gensim.models.Word2Vec.load('/home/embedding')
def embedded_similarity(y_pred, y_true):
global vocab, embedding_model
with tf.name_scope("Similarity"):
#convert one-hot format to indices of max values (predictions)
pred_max = tf.argmax(y_pred,dimension=1)
true_max = tf.argmax(y_true,dimension=1)
#convert indices into embedded vectors
pred_vectors = tf.map_fn(lambda x: embedding_model[vocab[x]], pred_max)
true_vectors = tf.map_fn(lambda x: embedding_model[vocab[x]], true_max)
#calc dot product
dot_products = tf.reduce_sum(tf.mul(pred_vectors,true_vectors),axis=1)
#return inverse mean of dot products
return -1*(tf.reduce_mean(dot_products))
L'erreur renvoyée est:
ValueError: Index out of range using input dim 0; input has only 0 dims for 'Similarity/map/while/strided_slice' (op: 'StridedSlice') with input shapes: [], [1], [1], [1].
Cela indique que je ne peux pas utiliser un tenseur pour indexer dans vocab (un tableau numpy). Cependant, je ne peux pas utiliser eval() pour saisir la valeur du tenseur car celle-ci n'est pas exécutée dans une session. J'ai donc besoin d'un moyen de mettre en place la transformation d'un tenseur d'indices 1D en un tenseur contenant les vecteurs mots correspondants, afin de calculer la perte.
Toute aide concernant ce problème, ou une autre façon d'évaluer mon modèle, est grandement appréciée.
aussi: l'erreur se produit sur la ligne avec tf.map_fn, et pointe vers où je indexe en vocab avec x – etc