【问题标题】:Convert Pandas dataframe to PyTorch tensor?将 Pandas 数据帧转换为 PyTorch 张量?
【发布时间】:2018-10-22 18:41:54
【问题描述】:

我想用 PyTorch 在 pandas 数据帧 df 上训练一个简单的神经网络。

其中一列名为"Target",它是网络的目标变量。如何将此数据帧用作 PyTorch 网络的输入?

我试过了,但它不起作用:

import pandas as pd
import torch.utils.data as data_utils

target = pd.DataFrame(df['Target'])
train = data_utils.TensorDataset(df, target)
train_loader = data_utils.DataLoader(train, batch_size=10, shuffle=True)

【问题讨论】:

  • 欢迎来到 StackOverflow!请阅读how to ask a question(尤其是how to create a good example)以获得良好的响应。
  • 问题: 您的特征 (df) 还包含目标变量 (df['Target'])(即您的网络在“作弊”,因为它可以看到结果为输入)

标签: python pandas dataframe pytorch


【解决方案1】:
#This works for me

target = torch.tensor(df['Targets'].values)
features = torch.tensor(df.drop('Targets', axis = 1).values)

train = data_utils.TensorDataset(features, target)
train_loader = data_utils.DataLoader(train, batch_size=10, shuffle=True)

【讨论】:

  • 您好,感谢您的贡献!与@iacob 的答案有什么不同?
  • 嗨,我必须先将目标和特征转换为 torch.tensor。
【解决方案2】:

您可以将df.values 属性(一个numpy 数组)直接传递给Dataset 构造函数:

import torch.utils.data as data_utils

# Creating np arrays
target = df['Target'].values
features = df.drop('Target', axis=1).values

# Passing to DataLoader
train = data_utils.TensorDataset(features, target)
train_loader = data_utils.DataLoader(train, batch_size=10, shuffle=True)

注意:您的特征 (df) 还包含目标变量 (df['Target']),即您的网络在“作弊”,因为它可以看到输入中的目标。您需要从特征集中删除此列。

【讨论】:

    【解决方案3】:

    您可以使用以下函数将任何数据框或熊猫系列转换为 pytorch 张量

    import pandas as pd
    import torch
    
    # determine the supported device
    def get_device():
        if torch.cuda.is_available():
            device = torch.device('cuda:0')
        else:
            device = torch.device('cpu') # don't have GPU 
        return device
    
    # convert a df to tensor to be used in pytorch
    def df_to_tensor(df):
        device = get_device()
        return torch.from_numpy(df.values).float().to(device)
    
    df_tensor = df_to_tensor(df)
    series_tensor = df_to_tensor(series)
    

    【讨论】:

      【解决方案4】:

      只需转换pandas dataframe -> numpy array -> pytorch tensor。这方面的一个例子如下所述:

      import pandas as pd
      import numpy as np
      import torch
      
      df = pd.read_csv('train.csv')
      target = pd.DataFrame(df['target'])
      del df['target']
      train = data_utils.TensorDataset(torch.Tensor(np.array(df)), torch.Tensor(np.array(target)))
      train_loader = data_utils.DataLoader(train, batch_size = 10, shuffle = True)
      

      希望这将帮助您使用 pytorch(与最新版本的 pytorch 兼容)创建自己的数据集。

      【讨论】:

        【解决方案5】:

        也许试试这个看看它是否可以解决你的问题(基于你的示例代码)?

        train_target = torch.tensor(train['Target'].values.astype(np.float32))
        train = torch.tensor(train.drop('Target', axis = 1).values.astype(np.float32)) 
        train_tensor = data_utils.TensorDataset(train, train_target) 
        train_loader = data_utils.DataLoader(dataset = train_tensor, batch_size = batch_size, shuffle = True)
        

        【讨论】:

          【解决方案6】:

          我指的是标题中的问题,因为您没有在文本中真正指定任何其他内容,因此只需将 DataFrame 转换为 PyTorch 张量。

          没有关于您的数据的信息,我只是将浮点值作为示例目标。

          将 Pandas 数据帧转换为 PyTorch 张量?

          import pandas as pd
          import torch
          import random
          
          # creating dummy targets (float values)
          targets_data = [random.random() for i in range(10)]
          
          # creating DataFrame from targets_data
          targets_df = pd.DataFrame(data=targets_data)
          targets_df.columns = ['targets']
          
          # creating tensor from targets_df 
          torch_tensor = torch.tensor(targets_df['targets'].values)
          
          # printing out result
          print(torch_tensor)
          

          输出:

          tensor([ 0.5827,  0.5881,  0.1543,  0.6815,  0.9400,  0.8683,  0.4289,
                   0.5940,  0.6438,  0.7514], dtype=torch.float64)
          

          使用 Pytorch 0.4.0 测试。

          我希望这会有所帮助,如果您还有其他问题 - 请尽管提问。 :)

          【讨论】:

          • 使用你的代码我写了这个:train_target = torch.tensor(train['Target'].values) train = torch.tensor(train.drop('Target', axis = 1).values) train_tensor = data_utils.TensorDataset(train, train_target) train_loader = data_utils.DataLoader(dataset = train_tensor, batch_size = batch_size, shuffle = True) 运行神经网络模型我得到这个错误:RuntimeError: Expected object of type torch.FloaTtensor but found type torch.DoubleTensor for argument #4 'mat1'
          • 您使用的是什么 PyTorch 版本?版本 0.3.1. 与版本 0.4.0. 非常不同。
          • 你的 DataFrame 是什么样子的?最好是更新您的问题,否则将很难重现您的问题。
          • 只是为了记录,在术语上:您不是在转换熊猫 DataFrame,而是熊猫系列(您首先将其强制转换为应用 .values 的数组)。
          • 张量是多维的(否则我们称它们为向量和矩阵)。您能否展示从 DataFrame 的列(系列)构建 3D 火炬张量?
          猜你喜欢
          • 2021-08-17
          • 2022-10-17
          • 2017-07-06
          • 2019-07-29
          • 2021-05-28
          • 2020-08-05
          相关资源
          最近更新 更多