使用pca.fit_transform,只有一个元素张量可以转换为Python标量错误



我正在尝试使用PCA进行降维,其中outputs是张量列表,其中每个张量的形状为(1,3,32,32(。这是代码:

from sklearn.decomposition import PCA
pca = PCA(10)
pca_result = pca.fit_transform(output)

但无论我尝试了什么,我都会不断地得到这个错误:

ValueError: only one element tensors can be converted to Python scalars

我知道大小为(1,3,32,32(的张量造成了这个问题,因为它在错误中寻找1个元素,但不知道如何解决它。我尝试过用循环输出来压平每个张量(不知道这是否是解决这个问题的正确方法(,使用以下代码,但这会导致pca中的错误:

new_outputs = []     
for i in outputs:
for j in i:
j = j.cpu()
j = j.detach().numpy()
j = j.flatten()
new_outputs.append(j)
pca_result = pca.fit_transform(new_output)

如果有人能帮我纠正这个错误,我将不胜感激,无论我采取的扁平化方法是否正确。

附言:我已经阅读了现有的帖子(post1,post2(讨论这个错误,但没有一个能解决我的问题。

假设张量存储在一个形状类似(10, 3, 32, 32)的矩阵中,其中10对应于张量的数量,则应将每个张量展平为:

import torch
from sklearn.decomposition import PCA
data= torch.rand((10, 3, 32, 32))
pca = PCA(10)
pca_result = pca.fit_transform(data.flatten(start_dim=1))

data.flatten(start_dim=1)使您的数据处于形状(10, 3*32*32)

您发布的错误实际上与您链接的某个帖子有关。PCA估计器使用fit()方法期望类似数组的对象,并且您提供了张量列表。

最新更新