2017-10-09 8 views
3

J'essaie d'utiliser tensorflow.contrib.learn.KMeansClustering dans le cadre d'un graphique dans Tensorflow. Je voudrais l'utiliser comme un composant d'un graphique, en me donnant des prédictions et des centres. La partie pertinente du code est le suivant:Utilisation de l'estimateur tflearn de KMeans dans le cadre d'un graphique dans tensorflow

with tf.variable_scope('kmeans'): 
    kmeans = KMeansClustering(num_clusters=num_clusters, 
           relative_tolerance=0.0001) 
    kmeans.fit(input_fn= (lambda : [X, None])) 
    clusters = kmeans.clusters() 

init_vars = tf.global_variables_initializer() 
sess = tf.Session() 
sess.run(init_vars, feed_dict={X: full_data_x}) 
clusters_np = sess.run(clusters, feed_dict={X: full_data_x}) 

Cependant, je reçois l'erreur suivante:

ValueError: Tensor("kmeans/strided_slice:0", shape=(), dtype=int32) must be from the same graph as Tensor("sub:0", shape=(), dtype=int32). 

Je crois que c'est parce que est un estimateur k-moyennes de TFLearn; ce qui serait plus proche d'un graphique entier que d'un seul module. Est-ce exact? Puis-je le transformer en un module du graphique par défaut? Si non, y a-t-il une fonction pour faire des KMeans dans un autre graphe?

Merci!

Répondre

1

L'estimateur KMeansClustering utilise des opérations de la fonction tf.contrib. Le factorization MNIST example utilise KMeans sans un estimateur.

+0

J'ai regardé votre suggestion et la [documentation] (https://www.tensorflow.org/versions/master/api_docs/python/tf/contrib/factorization/KMeans) pour la fonction. Si je ne me trompe pas, ils ne fournissent que des distances entre les entrées et les centres et les étiquettes pour chaque entrée. Cependant, je cherche les centres eux-mêmes, une idée de comment les obtenir? Merci! – etal

+0

Ne ressemble pas à un accesseur public. Vous pouvez soit faire la moyenne des points en utilisant les assignations de cluster, ou appeler '_create_variables' dans un' variable_scople' avec 'reuse = True' (vous devrez aussi envelopper la création de variables d'origine dans une portée variable). –

+0

Je peux voir que _create_variables génère des centres, mais je ne vois pas comment/quand ils sont influencés par les données d'entrée. Comment utilisez-vous le variable_scope pour le faire? – etal

1

L'API estimateur construit k-moyennes sa propre tf.Graph et gérer tf.Session par lui-même, de sorte que vous n'avez pas besoin d'exécuter un tf.Session pour nourrir les valeurs (ce qui est fait par input_fn), c'est pourquoi le ValueError lève-toi.

L'utilisation correcte des k-moyennes estimateur est simplement:

kmeans = KMeansClustering(num_clusters=num_clusters, 
          relative_tolerance=0.0001) 
kmeans.fit(input_fn=(lambda: [X, None])) 
clusters = kmeans.clusters() 

X est un tenseur d'entrée tf.constant qui contient les valeurs (par exemple définie comme Xnp.array et à utiliser tf.convert_to_tensor). Ici X n'est pas un tf.placeholder qui doit être alimenté lors d'une exécution tf.Session.

Mise à jour pour tensorflow 1.4:

Utilisez tf.contrib.factorization.KMeansClustering API pour trouver les centres de cluster:

kmeans=tf.contrib.factorization.KMeansClustering(num_clusters=num_clusters) 
kmeans.train(input_fn=(lambda: [X, None])) 
centers = kmeans.cluster_centers() 

Pour prédire les centres pour les fonctions données utilisent simplement:

predictions = kmeans.predict(input_fn=(lambda:[another_X, None])) 
0

Ici link est un approche à utiliser KMeans Clustering u chantez tf.contrib.factorization.KMeansClustering. Il indique que la solution est de retarder la création de l'entrée Tensor(X) en le plaçant à l'intérieur du input_fn lambda, qui sera invoqué au sein de train(). Alors vous n'obtiendrez pas l'erreur mentionnée ci-dessus.