Невозможно изменить количество кластеров в 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 огромен, если нужно, могу прикрепить файлом.

Вы чистите свой график между повторами с разными номерами кластеров?

GPhilo 28.05.2019 10:20

@GPhilo Нет! Значит ли это, что у меня все тот же график с 1024 кластерами? Как это очистить?

Mikhail_Sam 28.05.2019 10:22
tf.reset_default_graph()
GPhilo 28.05.2019 10:22

@GPhilo Я использовал его без графика. Просто написал код, как в вопросе, и запустил. Поэтому, если я добавлю эту строку, ничего не изменится. Я также пытался добавить свой код в with tf.Graph().as_default():, но тоже не работает :(

Mikhail_Sam 28.05.2019 10:27

@GPhilo закройте IDE и откройте ее (чтобы очистить все данные) - все та же ошибка, если я использую 256 кластеров в начале.

Mikhail_Sam 28.05.2019 10:29
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
5
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я нашел проблему: как видите, я сохраняю кодовую книгу в parameters/clusters. Когда он создал график сохранения тензорного потока, здесь тоже. Итак, поведение по умолчанию для тензорного потока — НЕ СОЗДАВАЙТЕ новый график, если он уже существует!

Поэтому каждый раз, когда я пытался запустить KMeansClustering, он все еще использовал график, загруженный из кодовой книги. Я решил проблему, удаляя папку clusters каждый раз, когда запускаю KMeansClustering.

У меня все еще есть некоторые проблемы: я создаю новые кластеры и запускаю параллельно 2 скрипта для создания функций с его помощью: один из них создает для старой кодовой книги, а другой для новой! Все еще принудительно, но я рекомендую перезапустить все после того, как вы создали новую книгу кодов (возможно, некоторая информация все еще загружена в tensorflow).

Другие вопросы по теме