我正在研究图像分类问题,并且正在创建一个词袋模型。为此,我提取了所有图像的 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 在此评论中所说,我只需使用小批量K均值 http://scikit-learn.org/stable/modules/generated/sklearn.cluster.MiniBatchKMeans.html类来避免这个问题:
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'))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)