在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,因此使用风险自负。