TensorFlow中更快的K-Means聚类

JR *_*yer 5 k-means python-3.x tensorflow

亲爱的TensorFlow社区,

我正在训练分类器tf.contrib.factorization.KMeansClustering,但是训练非常慢,并且只使用了1%的GPU.

但是,我的4个CPU内核的使用率持续达到35%左右.

K-Means是否为CPU编写的内容比GPU更多?

有没有办法可以将更多的计算转移到GPU,或者其他一些方法来加速培训?

下面是我的训练脚本(Python3).

感谢您的时间.

import tensorflow as tf 



def parser(record):

  features={
    'feats': tf.FixedLenFeature([], tf.string),
  }

  parsed = tf.parse_single_example(record, features)
  feats = tf.convert_to_tensor(tf.decode_raw(parsed['feats'], tf.float64))

  return {'feats': feats}


def my_input_fn(tfrecords_path):

    dataset = (
        tf.data.TFRecordDataset(tfrecords_path)
        .map(parser)
        .batch(1024)
    )

    iterator = dataset.make_one_shot_iterator()
    batch_feats = iterator.get_next()

    return batch_feats


### SPEC FUNCTIONS ###

train_spec_kmeans = tf.estimator.TrainSpec(input_fn = lambda: my_input_fn('/home/ubuntu/train.tfrecords') , max_steps=10000)
eval_spec_kmeans = tf.estimator.EvalSpec(input_fn = lambda: my_input_fn('/home/ubuntu/eval.tfrecords') )



### INIT ESTIMATOR ###

KMeansEstimator = tf.contrib.factorization.KMeansClustering(
    num_clusters=500,
    feature_columns = [tf.feature_column.numeric_column(
        key='feats',
        dtype=tf.float64,
        shape=(377,),
    )],
    use_mini_batch=True)


### TRAIN & EVAL ###

tf.estimator.train_and_evaluate(KMeansEstimator, train_spec_kmeans, eval_spec_kmeans)
Run Code Online (Sandbox Code Playgroud)

最好的,约什

JR *_*yer 5

这是迄今为止我最好的信息答案time,建立在 Eliethesaiyan 的答案和链接到 docs 的基础上

我的原始Dataset代码块和性能:

dataset = (
 tf.data.TFRecordDataset(tfrecords_path)
 .map(parse_fn)
 .batch(1024)
)

real    1m36.171s
user    2m57.756s
sys     0m42.304s
Run Code Online (Sandbox Code Playgroud)

Eliethesaiyan 的回答 ( prefetch+ num_parallel_calls)

dataset = (
    tf.data.TFRecordDataset(tfrecords_path)
    .map(parse_fn,num_parallel_calls=multiprocessing.cpu_count())
    .batch(1024)
    .prefetch(1024)
   )

real  0m41.450s
user  1m33.120s
sys   0m18.772s
Run Code Online (Sandbox Code Playgroud)

从使用文档map_and_batch+ num_parallel_batches+ prefetch

dataset = (
    tf.data.TFRecordDataset(tfrecords_path)
    .apply(
       tf.contrib.data.map_and_batch(
          map_func=parse_fn,
          batch_size=1024,
          num_parallel_batches=multiprocessing.cpu_count()
        )
    )
    .prefetch(1024)
 )

real   0m32.855s
user   1m11.412s
sys    0m10.408s
Run Code Online (Sandbox Code Playgroud)