使用 "tf.contrib.factorization.KMeansClustering"

Use "tf.contrib.factorization.KMeansClustering"

参考这个Link,(the Link) 我尝试练习使用 tf.contrib.factorization.KMeansClustering 进行聚类。下面的简单代码可以正常工作:

import numpy as np
import tensorflow as tf

# ---- Create Data Sample -----
k = 5
n = 100
variables = 5
points = np.random.uniform(0, 1000, [n, variables])

# ---- Clustering -----
input_fn=lambda: tf.train.limit_epochs(tf.convert_to_tensor(points, dtype=tf.float32), num_epochs=1)
kmeans=tf.contrib.factorization.KMeansClustering(num_clusters=6)
kmeans.train(input_fn=input_fn)
centers = kmeans.cluster_centers()

# ---- Print out -----
cluster_indices = list(kmeans.predict_cluster_index(input_fn))
for i, point in enumerate(points):
  cluster_index = cluster_indices[i]
  print ('point:', point, 'is in cluster', cluster_index, 'centered at', centers[cluster_index])

我的问题是为什么这个 "input_fn" 代码可以解决问题? 如果我把代码改成这样,它会 运行 进入无限循环。为什么??

input_fn=lambda:tf.convert_to_tensor(points, dtype=tf.float32)

从文档 (here) 来看,train() 似乎需要 input_fn 的参数,它只是一个 'tf.data.Dataset' 对象,就像 Tensor(X)。那么,为什么我必须做所有这些关于 lambda 的棘手事情:tf.train.limit_epochs()?

哪位熟悉tensorflow estimators基础的可以帮忙解释一下吗?非常感谢!

My question is why would this "input_fn" code does the trick? If I change the code to this, it will run into an infinite loop. Why??

文档指出 input_fn 被重复调用,直到它 returns 一个 tf.errors.OutOfRangeError。用 tf.train.limit_epochs 装饰你的张量确保错误最终被提出,这向 KMeans 发出它应该停止训练的信号。