无法更改 KMeansClustering Tensorflow 中的簇数

Cannot change number of clusters in KMeansClustering Tensorflow

我找到了这段代码,它运行良好。这个想法 - 拆分我的数据并在其上训练 KMeansClustering。所以我创建了 InitHook 和迭代器并将其用于训练。

class _IteratorInitHook(tf.train.SessionRunHook):
    """Hook to initialize data iterator after session is created."""

    def __init__(self):
        super(_IteratorInitHook, self).__init__()
        self.iterator_initializer_fn = None

    def after_create_session(self, session, coord):
        """Initialize the iterator after the session has been created."""
        del coord
        self.iterator_initializer_fn(session)


# Run K-means clustering.
def _get_input_fn():
    """Helper function to create input function and hook for training.
    Returns:
        input_fn: Input function for k-means Estimator training.
        init_hook: Hook used to load data during training.
    """
    init_hook = _IteratorInitHook()

    def _input_fn():
        """Produces tf.data.Dataset object for k-means training.
        Returns:
            Tensor with the data for training.
        """
        features_placeholder = tf.placeholder(tf.float32,
                                                my_data.shape)
        delf_dataset = tf.data.Dataset.from_tensor_slices((features_placeholder))
        delf_dataset = delf_dataset.shuffle(1000).batch(
            my_data.shape[0])
        iterator = delf_dataset.make_initializable_iterator()

        def _initializer_fn(sess):
            """Initialize dataset iterator, feed in the data."""
            sess.run(
                iterator.initializer,
                feed_dict={features_placeholder: my_data})

        init_hook.iterator_initializer_fn = _initializer_fn
        return iterator.get_next()

    return _input_fn, init_hook


input_fn, init_hook = _get_input_fn()

output_cluster_dir = 'parameters/clusters'

kmeans = tf.contrib.factorization.KMeansClustering(
    num_clusters=1024,
    model_dir=output_cluster_dir,
    use_mini_batch=False,
)


print('Starting K-means clustering...')
kmeans.train(input_fn, hooks=[init_hook])

但是,如果我将 num_clusters 更改为 512 或 256,则会出现下一个错误:

InvalidArgumentError: segment_ids[0] = 600 is out of range [0, 256)
[[node UnsortedSegmentSum (defined at /home/mikhail/.conda/envs/tf2/lib/python3.7/site-packages/tensorflow_estimator/python/estimator/estimator.py:1112) ]] [[node Squeeze (defined at /home/mikhail/.conda/envs/tf2/lib/python3.7/site-packages/tensorflow_estimator/python/estimator/estimator.py:1112) ]]

看起来我在将数据拆分成批次时遇到了一些问题,或者我的 KMeans 默认使用 1024 个簇,即使我设置了另一个值!

我不知道要更改什么才能使其正常工作。 Traceback 很大,如果需要我可以附加为文件。

我发现了问题: 如您所见,我将密码本保存到 parameters/clusters。当它在这里也创建了 tensorflow 保存图时。 所以 tensorflow 的默认行为 - 如果它已经存在,请不要创建新图!

所以每次我尝试 运行 KMeansClustering 它仍然使用从密码本加载的图表。 我通过每次 运行 KMeansClustering.

删除文件夹 clusters 来解决这个问题

我还有一些问题:我创建了新的集群,并并行启动 2 个脚本来使用它创建特征:其中一个为旧码本创建,一个为新码本创建!仍然强迫它,但我的建议是在你创建新的密码本后重新启动一切(也许一些信息仍然加载在 tensorflow 中)。