我正在尝试使用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()
方法期望类似数组的对象,并且您提供了张量列表。