使用 KMeans tflearn 估计器作为张量流中图形的一部分

Using KMeans tflearn estimator as part of a graph in tensorflow

我正在尝试使用 tensorflow.contrib.learn.KMeansClustering 作为 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})

但是,我收到以下错误:

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

我相信这是因为 KMeansClustering 是一个 TFLearn 估计器;与单个模块相比,这更类似于整个图。那是对的吗?我可以将它转换为默认图形的模块吗?如果没有,是否有在另一个图中执行 KMeans 的函数?

谢谢!

KMeansClustering 估计器使用来自 tf.contrib.factorization 的操作。 factorization MNIST example 使用没有 Estimator 的 KMeans。

KMeansClustering Estimator API 构建自己的 tf.Graph 并自行管理 tf.Session,因此您无需 运行 tf.Session feed 值(由 input_fn 完成),这就是 ValueError 出现的原因。

KMeansClustering Estimator 的正确用法是:

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

其中 X 是保存值的 tf.constant 输入张量(例如,将 X 定义为 np.array 而不是使用 tf.convert_to_tensor)。这里 X 不是需要在 tf.Session 运行 处喂食的 tf.placeholder

TensorFlow 1.4 更新:

使用tf.contrib.factorization.KMeansClusteringAPI查找聚类中心:

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

要预测给定特征的中心,只需使用:

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

这里 link 是一种使用 KMeans 聚类 的方法,使用 tf.contrib.factorization.KMeansClustering。它表明解决方案是通过将输入 Tensor(X) 放入 input_fn lambda 中来延迟创建输入 Tensor(X),它将在 train() 中调用。这样就不会出现上面提到的错误了。