Sklearn.KMeans :如何避免内存或值错误



我正在研究一个图像分类问题,我正在创建一个单词袋模型。为此,我提取了所有图像的SIFT描述符,并且必须使用KMeans算法来找到用作我的单词袋的中心。

这是我拥有的数据:

  • 图像数量:1584
  • SIFT描述符的数量(32个元素的向量):571685
  • 中心数:15840

所以我运行了一个KMeans算法来计算我的中心:

dico = pickle.load(open('./dico.bin', 'rb')) # np.shape(dico) = (571685, 32)
k = np.size(os.listdir(img_path)) * 10 # = 1584 * 10
kmeans = KMeans(n_clusters=k, n_init=1, verbose=1).fit(dico)
pickle.dump(kmeans, open('./kmeans.bin', 'wb'))
pickle.dump(kmeans.cluster_centers_, open('./dico_reduit.bin', 'wb'))

使用此代码,我遇到了内存错误,因为我的笔记本电脑上没有足够的内存(只有 2GB),所以我决定将中心数除以 2,并随机选择一半的 SIFT 描述符。这一次,我得到了Value Error : array is too big.

我该怎么做才能在没有内存问题的情况下获得相关结果?

正如@sascha在此评论中所说,我只需要使用MiniBatchKMeans类来避免此问题:

dico = pickle.load(open('./dico.bin', 'rb'))
batch_size = np.size(os.listdir(img_path)) * 3
kmeans = MiniBatchKMeans(n_clusters=k, batch_size=batch_size, verbose=1).fit(dico)
pickle.dump(kmeans, open('./minibatchkmeans.bin', 'wb'))

相关内容

  • 没有找到相关文章

最新更新