如何将Pandas DataFrame转为PyTorch张量并基于其训练简单神经网络?
其实转换方法很直接,核心是把DataFrame的数值数据转成PyTorch能识别的张量格式,这里有两种常用方式:
方法一:直接用
torch.tensor()
你可以直接传入DataFrame的values属性(这会返回一个numpy数组),同时建议指定dtype为torch.float32——因为PyTorch默认的浮点类型是float32,而Pandas默认是float64,统一类型能避免后续的兼容性问题。示例代码:import pandas as pd import torch # 示例DataFrame df = pd.DataFrame({'feature1': [1.2, 3.4, 5.6], 'feature2': [7.8, 9.0, 2.3]}) # 转换为PyTorch张量 tensor = torch.tensor(df.values, dtype=torch.float32)方法二:用
torch.from_numpy()
因为df.values本质是numpy数组,所以也可以用torch.from_numpy()转换,再调用.float()转成float32:tensor = torch.from_numpy(df.values).float()
⚠️ 注意:如果你的DataFrame里包含分类变量(比如字符串类型),得先做预处理,比如用pd.get_dummies()做独热编码,或者用LabelEncoder转成数值,确保所有数据都是数值类型再转张量。
先说说你代码出问题的原因:TensorDataset只接受PyTorch张量作为输入,但你直接传了Pandas的DataFrame和Series,这肯定会报错。下面是完整的修复方案,从数据处理到模型训练一步到位:
第一步:修复数据加载代码
先把特征和标签都转换成PyTorch张量,再构建数据集和数据加载器:
import pandas as pd import torch import torch.utils.data as data_utils from torch import nn # 假设你的df已经加载完成,包含特征列和Target标签列 # 1. 分离特征和标签 features = df.drop('Target', axis=1) # 去掉标签列,保留所有特征 target = df['Target'] # 2. 转换为PyTorch张量 # 特征用float32(和PyTorch模型权重类型匹配) features_tensor = torch.tensor(features.values, dtype=torch.float32) # 标签如果是分类任务,用torch.long;如果是回归任务,用torch.float32 target_tensor = torch.tensor(target.values, dtype=torch.long) # 3. 创建数据集和数据加载器 train_dataset = data_utils.TensorDataset(features_tensor, target_tensor) train_loader = data_utils.DataLoader(train_dataset, batch_size=10, shuffle=True)
第二步:定义简单神经网络
这里以二分类任务为例,构建一个三层全连接网络:
class SimpleNN(nn.Module): def __init__(self, input_size): super().__init__() self.network = nn.Sequential( nn.Linear(input_size, 64), # 输入层到隐藏层1 nn.ReLU(), # 激活函数 nn.Linear(64, 32), # 隐藏层1到隐藏层2 nn.ReLU(), nn.Linear(32, 2) # 隐藏层2到输出层(二分类输出2个类别概率) ) def forward(self, x): return self.network(x) # 初始化模型:input_size是特征列的数量 input_size = features.shape[1] model = SimpleNN(input_size)
第三步:设置训练组件并启动训练
选择合适的损失函数、优化器,然后写训练循环:
# 损失函数:二分类用CrossEntropyLoss;回归用MSELoss criterion = nn.CrossEntropyLoss() # 优化器:常用Adam,学习率设0.001 optimizer = torch.optim.Adam(model.parameters(), lr=0.001) # 训练循环 num_epochs = 10 model.train() # 切换到训练模式 for epoch in range(num_epochs): total_loss = 0.0 for batch_features, batch_targets in train_loader: # 前向传播:得到模型输出 outputs = model(batch_features) # 计算损失 loss = criterion(outputs, batch_targets) # 反向传播+优化:清空梯度→计算梯度→更新权重 optimizer.zero_grad() loss.backward() optimizer.step() total_loss += loss.item() # 打印每个epoch的平均损失 print(f"Epoch {epoch+1}/{num_epochs}, Average Loss: {total_loss/len(train_loader):.4f}")
这样整个流程就能正常运行啦~核心就是记住:PyTorch的数据加载组件只认张量,一定要先把Pandas数据转成张量再使用。
内容的提问来源于stack exchange,提问作者M. Fabio

