使用Faiss Kmeans对ResNet50提取的图像特征聚类出现报错如何解决
Faiss KMeans 两类报错的排查解决方法
报错1:AttributeError: 'Kmeans' object has no attribute 'fit'
- 根本原因:
fit是你自定义封装的FaissKMeans类的方法,原生faiss.Kmeans类本身没有提供fit方法,你直接实例化原生faiss的Kmeans类调用fit自然触发属性不存在报错。
报错2:调用train方法触发AssertionError
- 根本原因:初始化
faiss.Kmeans时的第一个参数d要求传入特征向量的维度,你错误传入了feat.shape[0](即样本总数),ResNet50提取的特征维度为2048,对应feat.shape[1],参数传错导致维度校验不通过,触发断言报错。
修正后的可运行代码
方案1:使用你自定义的FaissKMeans封装类(推荐,和你之前的sklearn风格用法一致)
# 实例化自定义的FaissKMeans类,传入肘方法得到的聚类数 kmeans = FaissKMeans(n_clusters=elbow, n_init=10, max_iter=200) # fit方法第二个参数y无实际作用,传入None即可 kmeans.fit(feat, None) # 获得所有样本的聚类标签 cluster_labels = kmeans.predict(feat)
方案2:直接使用原生faiss.Kmeans
# 注意d参数传入特征维度feat.shape[1] kmeans = faiss.Kmeans(d=feat.shape[1], k=elbow, niter=200, nredo=10) # 输入特征转float32格式执行训练 kmeans.train(feat.astype(np.float32)) # 获得所有样本的聚类标签 _, cluster_labels = kmeans.index.search(feat.astype(np.float32), 1)
内容的提问来源于stack exchange,提问作者Cressida
相关产品推荐
相关产品推荐

