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

only one element tensors can be converted to Python scalars error with pca.fit_transform

我正在尝试使用 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)

如果有人可以帮助解决这个错误,我将不胜感激,无论我采用的展平方法是否正确。

PS:我已阅读讨论此错误的现有帖子 (,),但其中 none 可以解决我的问题。

假设你的张量存储在一个形状像 (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)

您 post 编辑的错误实际上与您链接的 post 之一有关。 PCA 估计器需要使用 fit() 方法的类似数组的对象,并且您提供了张量列表。