You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Pandas DataFrame转为PyTorch张量并基于其训练简单神经网络?

1. 如何将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转成数值,确保所有数据都是数值类型再转张量。


2. 如何基于Pandas DataFrame训练简单神经网络(修复你的代码)?

先说说你代码出问题的原因: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:33:19