Sklearn.KMeans : 如何避免内存或值错误?
Sklearn.KMeans : how to avoid Memory or Value Error?
我正在处理图像分类问题,并且正在创建词袋模型。为此,我提取了我所有图像的 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,然后选择 运行domly half我的 SIFT 描述符。这次,我得到了Value Error : array is too big
。
如何在没有内存问题的情况下获得相关结果?
正如@sascha 在此评论中所说,我只需要使用 MiniBatchKMeans class 来避免这个问题:
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'))
我正在处理图像分类问题,并且正在创建词袋模型。为此,我提取了我所有图像的 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,然后选择 运行domly half我的 SIFT 描述符。这次,我得到了Value Error : array is too big
。
如何在没有内存问题的情况下获得相关结果?
正如@sascha 在此评论中所说,我只需要使用 MiniBatchKMeans class 来避免这个问题:
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'))