在tensorflow中将KMeans tflearn估计器用作图的一部分

在tensorflow中将KMeans tflearn估计器用作图的一部分,tensorflow,k-means,tflearn,Tensorflow,K Means,Tflearn,我正在尝试使用tensorflow.contrib.learn.KMeansClustering作为tensorflow中图形的一部分。我想用它作为一个图表的组成部分,给我预测和中心。守则的有关部分如下: 带有tf.variable_scope('kmeans')的: kmeans=KMeansClustering(num_clusters=num_clusters, 相对公差=0.0001) fit(输入_fn=(lambda:[X,无]) clusters=kmeans.clusters()

我正在尝试使用
tensorflow.contrib.learn.KMeansClustering
作为tensorflow中图形的一部分。我想用它作为一个图表的组成部分,给我预测和中心。守则的有关部分如下:

带有tf.variable_scope('kmeans')的
:
kmeans=KMeansClustering(num_clusters=num_clusters,
相对公差=0.0001)
fit(输入_fn=(lambda:[X,无])
clusters=kmeans.clusters()
init_vars=tf.global_variables_initializer()
sess=tf.Session()
run(init_vars,feed_dict={X:full_data_X})
clusters\u np=sess.run(clusters,feed\u dict={X:full\u data\u X})
但是,我得到以下错误:

ValueError:Tensor(“kmeans/stridded_slice:0”,shape=(),dtype=int32)必须来自与Tensor(“sub:0”,shape=(),dtype=int32)相同的图形。
我相信这是因为KMeansClustering是一个TFLearn估计器;这将更类似于一个完整的图形,而不是一个单独的模块。对吗?我可以将其转换为默认图形的模块吗?如果没有,是否有函数在另一个图中执行KMeans


谢谢

KMeansClustering估计器使用tf.contrib.factorization中的ops。使用KMeans而不使用估计器。

KMeansClustering Estimator API构建自己的
tf.Graph
并自行管理
tf.Session
,因此无需运行
tf.Session
来输入值(由
input\u fn
完成),这就是出现
ValueError
的原因

KMeansClustering估计器的正确用法如下:

kmeans = KMeansClustering(num_clusters=num_clusters,
                          relative_tolerance=0.0001)
kmeans.fit(input_fn=(lambda: [X, None]))
clusters = kmeans.clusters()
其中,
X
是保存值的
tf.常数
输入张量(例如,将
X
定义为
np.数组
,然后使用
tf.转换为张量
)。这里的
X
不是需要在
tf.Session
运行时馈送的
tf.placeholder

TensorFlow 1.4的更新:

使用
tf.contrib.factorization.KMeansClustering
API查找群集中心:

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]))

下面是一种使用
tf.contrib.factorization.KMeansClustering
使用KMeans聚类的方法。它告诉我们解决方案是将输入
张量(X)
放入
input\u fn
lambda中,延迟输入
张量(X)
的创建,lambda将在
train()
中调用。这样您就不会出现上述错误。

我已经查看了您的建议和函数的配置。如果我没有弄错的话,它们只提供从输入到中心的距离以及每个输入的标签。然而,我正在寻找中心本身,知道如何获得它们吗?谢谢看起来没有公共访问器。您可以使用集群分配对点进行平均,或者使用
reuse=True
variable\u scople
中调用
\u create\u variables
(您还必须将原始变量创建包装在变量范围中)。我可以看到_create\u variables输出中心,但我不知道他们是如何/何时受到输入数据的影响的。如何使用变量_范围来执行此操作?中心存储在一个变量中,该变量在培训期间更新。因此,只要对同一变量有句柄,就可以读取更新。因此,在原始/正常的培训调用中,将
和变量范围(“kmeans\u variables”)用作vs:
,然后关闭范围并重新打开一个
和变量范围(vs,reuse=True):
并手动调用
\u创建变量。如果它不抱怨缺少变量,那么您将拥有k-means正在更新的相同变量的句柄。请注意,这不是k-means的公共API,因此使用风险自负。