【问题标题】:only one element tensors can be converted to Python scalars error with pca.fit_transform使用 pca.fit_transform 只能将一个元素张量转换为 Python 标量错误
【发布时间】:2022-01-19 07:36:35
【问题描述】:

我正在尝试使用 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:我已经阅读了讨论此错误的现有帖子 (post1,post2),但没有一个可以解决我的问题。

【问题讨论】:

    标签: pytorch pca


    【解决方案1】:

    假设您的张量存储在一个形状类似于 (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() 方法的类数组对象,并且您提供了张量列表。

    【讨论】:

      猜你喜欢
      • 2021-07-23
      • 2021-03-04
      • 2021-03-16
      • 2020-11-08
      • 1970-01-01
      • 2019-02-04
      • 2020-09-24
      • 2022-01-12
      • 1970-01-01
      相关资源
      最近更新 更多