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

如何用PyTorch基于209行8列的CSV文件创建CNN模型?

PyTorch CNN 适配小型表格数据集的实现方案

对于表格类数据集,我们可以用**一维CNN(Conv1d)**来处理——它适合处理序列/一维特征数据,不需要像图像CNN那样依赖二维结构。下面是完整的实现步骤和代码:

1. 数据加载与预处理

首先将CSV数据转换为PyTorch可处理的张量格式,并调整输入形状以适配CNN要求(CNN输入需包含通道维度)。假设你的CSV最后一列为标签,其余列为特征:

import pandas as pd
import torch
from torch.utils.data import Dataset, DataLoader
from torch import nn

# 加载CSV数据
df = pd.read_csv("your_dataset.csv")
# 分离特征与标签(根据实际列数调整索引)
X = df.iloc[:, :-1].values  # 形状: (209, 7),若8列全为特征则去掉`:-1`
y = df.iloc[:, -1].values

# 自定义数据集类
class TabularDataset(Dataset):
    def __init__(self, features, labels):
        # 转换特征为张量,并添加通道维度(CNN要求输入格式:[样本数, 通道数, 特征长度])
        self.features = torch.tensor(features, dtype=torch.float32).unsqueeze(1)
        # 标签格式:分类任务用long,回归任务用float
        self.labels = torch.tensor(labels, dtype=torch.long)

    def __len__(self):
        return len(self.features)

    def __getitem__(self, idx):
        return self.features[idx], self.labels[idx]

# 创建数据加载器
dataset = TabularDataset(X, y)
dataloader = DataLoader(dataset, batch_size=8, shuffle=True)

2. 定义简易一维CNN模型

构建包含卷积层、池化层和全连接层的轻量模型,注释已标注各层输入输出形状:

class SimpleTabularCNN(nn.Module):
    def __init__(self, input_channels=1, input_feature_len=7, num_classes=2):
        super().__init__()
        # 一维卷积层:提取局部特征
        self.conv1 = nn.Conv1d(input_channels, out_channels=16, kernel_size=3)
        # 池化层:压缩特征维度
        self.pool = nn.MaxPool1d(kernel_size=2)
        # 计算卷积+池化后的特征长度,用于全连接层输入维度
        post_pool_len = (input_feature_len - 3 + 1) // 2
        # 全连接层:映射到分类/回归输出
        self.fc1 = nn.Linear(16 * post_pool_len, 32)
        self.fc2 = nn.Linear(32, num_classes)
        self.relu = nn.ReLU()

    def forward(self, x):
        # x初始形状: [batch_size, 1, input_feature_len]
        x = self.relu(self.conv1(x))  # 卷积后形状: [batch_size, 16, 5](以input_feature_len=7为例)
        x = self.pool(x)              # 池化后形状: [batch_size, 16, 2]
        x = x.flatten(start_dim=1)    # 展平为一维特征: [batch_size, 32]
        x = self.relu(self.fc1(x))
        x = self.fc2(x)
        return x

# 初始化模型(根据你的数据集调整参数)
model = SimpleTabularCNN(input_feature_len=7, num_classes=2)

3. 训练循环示例

基础的训练流程,适配分类任务(回归任务需修改损失函数和标签类型):

# 损失函数与优化器
criterion = nn.CrossEntropyLoss()  # 分类任务用,回归任务替换为nn.MSELoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)

# 训练3个epoch
epochs = 3
for epoch in range(epochs):
    running_loss = 0.0
    for inputs, labels in dataloader:
        optimizer.zero_grad()
        outputs = model(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()
        running_loss += loss.item()
    
    print(f"Epoch {epoch+1}, Average Loss: {running_loss/len(dataloader):.4f}")

关键调整说明

  • 若你的数据集是回归任务:将num_classes设为1,损失函数换为nn.MSELoss(),标签的dtype改为torch.float32。
  • 若8列全为特征:将input_feature_len设为8,并对应调整全连接层的输入维度(计算方式:(8-3+1)//2 = 3,则nn.Linear(16*3, 32))。
  • 如果特征无顺序关联,CNN效果可能与MLP接近,但以上实现满足你使用CNN的需求。

内容的提问来源于stack exchange,提问作者Soumyashree Sahoo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 00:04:02