2017-10-17 4 views
2

Je viens de commencer à utiliser Sklearn (MLPRegressor) et Keras (Sequential, avec des couches Dense).Y a-t-il un moyen d'utiliser la similitude cosinus au lieu du produit scalaire en python (sklearn/keras)

Aujourd'hui, je lis le document this décrivant comment l'utilisation de la similitude de cosinus au lieu du produit scalaire améliore les performances. Ceci dit essentiellement que si nous remplaçons f(w^Tx) par f((w^Tx)/(|x||w|)), c'est-à-dire que nous ne fournissons pas simplement le produit scalaire à la fonction d'activation mais que nous le normalisons, nous obtenons une performance meilleure et plus rapide.

Existe-t-il un moyen de le faire en Python, spécifiquement dans MLPRegressor dans SKlearn (ou autre), ou dans Keras? (peut-être TensorFlow?)

+0

vérifier ce https://stackoverflow.com/questions/43357732/how-to-calculate-the-cosine-similarity-between-two-tensors/43358711#43358711 –

Répondre

1

Sklearn utilise des réseaux prédéfinis, donc non. Je ne pense pas non plus que ce soit possible dans Keras, car il a des couches prédéfinies.

Il peut cependant être implémenté dans Tensorflow. Notez que dans TF vous pouvez explicitement définir des calques.

Par exemple, dans this snippet vous auriez besoin d'ajouter une normalisation dans la ligne 25, à savoir que vous pouvez diviser les lignes de sortie tf.nn.sigmoid(tf.matmul(X, w_1)) par des normes appropriées de lignes d'entrée (vous pouvez les obtenir en utilisant tf.nn.l2_normalize avec dim=1)

+0

Merci! Donc, fondamentalement, j'aurais: 'h = tf.nn.sigmoid (tf.matmul (X, w_1) \ tf.matmul (tf.nn.l2_normalize (X, dim = 1), tf.nn.l2_normalize (w_1)) '? –

+0

ou peut-être ' h = tf.nnsigmoid (tf.divide (tf.matmul (X, W_1), tf.matmul (tf.nn.l2_normalize (X, dim = 1), tf.nn.l2_normalize (w_1)))) ' –

+0

aussi, en exécutant l'exemple, nous voyons que la précision du test est de 100% vs 96% de la formation? Comment est-ce possible? –