【问题标题】:Clustering in TorchTorch 中的集群
【发布时间】:2015-05-23 18:15:49
【问题描述】:

我正在尝试学习用于机器学习的 Torch 库。

我知道 Torch 的重点是神经网络,但为了它,我试图在它上面运行 kmeans。如果没有的话,Torch 实现了应该类似于 numpy 数组的快速连续存储,并且Torch cheatsheet 引用了unsup 库进行无监督学习,为什么不呢?

我已经有 a benchmark 用于 K-means 实现。尽管那里的所有实现都故意使用未优化的算法(自述文件解释了原因),但 LuaJIT 能够在 611 毫秒内聚集 100000 个点。 Nim(不在存储库中)中的优化(或者我应该说,不是故意减慢)实现在 68 毫秒内运行,所以我期待介于两者之间。

不幸的是,事情变得更糟了,所以我怀疑我做错了什么。我写的是

require 'io'
cjson = require 'cjson'
require 'torch'
require 'unsup'

content = io.open("points.json"):read("*a")
data = cjson.decode(content)
points = torch.Tensor(data)
timer = torch.Timer()
centroids, counts = unsup.kmeans(points, 10, 15)

print(string.format('Time required: %f s', timer:time().real))

运行时间约为 6 秒!

谁能检查我在使用 Torch/unsup 时是否做错了什么?

如果有人想尝试一下,文件points.json在上面的存储库中

【问题讨论】:

  • 运行时间约为 6 秒:您的硬件/软件呢?
  • 这是一台 Vaio 笔记本电脑,但无论如何我在同一台计算机上使用纯 lua 实现非常幼稚的实现需要 611 毫秒

标签: lua machine-learning cluster-analysis torch


【解决方案1】:

谁能检查我在使用 Torch/unsup 时是否做错了什么?

一切听起来都正确(注意:建议使用local 变量):

  • data 是一个二维表,你使用对应的Torch constructor
  • points 是一个带有 nb 的二维张量。行= nb。点数和 nb。 cols = 点维度(此处为 2)。这就是unsup.kmeansexpects as input

您可以做的是更改批量大小(第 4 个参数)。它可能会影响性能。您还可以使用详细模式来输出每次迭代的平均时间:

-- batch size = 5000, no callback, verbose mode
centroids, counts = unsup.kmeans(points, 10, 15, 5000, nil, true)

【讨论】:

  • 如果是这种情况,听起来令人担忧。使用纯 Lua 表的 unoptimized implementation 运行时间为 1/10。我明天在工作中尝试更改批量大小,但似乎 unsup 做错了什么
  • 这确实是一个巨大的差异。我相信速度不是最初的重点。一些循环可能会像this one(通过将其替换为单个矩阵-矩阵乘法)或this one(通过直接操作raw data)进行优化。
  • @Andrea 关于 unsup 是否仍然/总体上比 Lua 中的实现慢的任何更新?
  • @RaziShaban 它似乎在做不同的事情。见本期讨论:github.com/koraykv/unsup/issues/27
猜你喜欢
  • 2018-05-13
  • 1970-01-01
  • 2015-03-14
  • 2013-01-17
  • 2011-11-28
  • 2013-08-20
  • 2021-12-06
  • 2019-11-26
  • 2012-02-24
相关资源
最近更新 更多