无法更改 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 中)。
我找到了这段代码,它运行良好。这个想法 - 拆分我的数据并在其上训练 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 中)。