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

基于自定义骨骼数据的PyTorch CNN舞者分类DataLoader使用疑问

自定义骨骼数据集的PyTorch DataLoader实现方案

要解决这个问题,核心是自定义一个Dataset类来封装你的数据和标签,之后就能直接把它传入DataLoader,和官方示例里用预配置数据集的逻辑完全一致。下面是具体步骤:

1. 数据格式调整

你想把骨骼数据当图像处理,得把每个样本的(50帧, 72关节)结构转换成PyTorch CNN要求的输入格式:(通道数, 高度, 宽度)。这里我们把每一个样本当成单通道“图像”,也就是给每个样本加一个通道维度,最终单个样本形状是(1, 50, 72)。

2. 代码实现

第一步:导入必要的库

import torch
from torch.utils.data import Dataset, DataLoader
import numpy as np

第二步:自定义Dataset类

假设你已经把数据加载成了numpy数组(如果是CSV或其他格式,先读取并转成numpy/torch张量就行):

  • data:形状是(3000, 50, 72),对应3000个样本,每个样本50帧、72个关节数据
  • labels:形状是(3000,),取值0/1/2的标签向量
class SkeletonDataset(Dataset):
    def __init__(self, data, labels):
        # 转成torch张量,调整数据类型(CNN一般用float32)
        self.data = torch.tensor(data, dtype=torch.float32)
        # 给每个样本添加通道维度,变成(1, 50, 72)
        self.data = self.data.unsqueeze(1)
        # 标签转成long类型,适配交叉熵损失
        self.labels = torch.tensor(labels, dtype=torch.long)
    
    def __len__(self):
        # 返回总样本数
        return len(self.data)
    
    def __getitem__(self, idx):
        # 返回第idx个样本和对应的标签
        return self.data[idx], self.labels[idx]

第三步:创建DataLoader

# 这里替换成你实际加载的数据和标签
data = np.random.rand(3000, 50, 72)  # 示例数据,仅作演示
labels = np.random.randint(0, 3, size=3000)  # 示例标签,仅作演示

# 实例化自定义数据集
trainset = SkeletonDataset(data, labels)

# 创建DataLoader,参数按需调整
batch_size = 32
trainloader = DataLoader(trainset, batch_size=batch_size, shuffle=True, num_workers=2)

3. 验证数据格式

可以跑一段代码检查输出是否符合预期:

for batch_data, batch_labels in trainloader:
    print("Batch数据形状:", batch_data.shape)  # 应该是 (32, 1, 50, 72)
    print("Batch标签形状:", batch_labels.shape)  # 应该是 (32,)
    break

4. 适配CNN输入

你的CNN输入层要对应这个数据形状,比如可以这么定义:

import torch.nn as nn
import torch.nn.functional as F

class SkeletonCNN(nn.Module):
    def __init__(self):
        super().__init__()
        # 输入通道数1,输出通道数16,卷积核3x3
        self.conv1 = nn.Conv2d(1, 16, 3)
        self.pool = nn.MaxPool2d(2, 2)
        self.conv2 = nn.Conv2d(16, 32, 3)
        # 注意:全连接层的输入维度需要根据卷积+池化后的实际尺寸计算,这里是示例值
        self.fc1 = nn.Linear(32 * 11 * 17, 128)
        self.fc2 = nn.Linear(128, 3)  # 3个分类类别
    
    def forward(self, x):
        x = self.pool(F.relu(self.conv1(x)))
        x = self.pool(F.relu(self.conv2(x)))
        x = torch.flatten(x, 1)  # 把卷积输出展平成一维
        x = F.relu(self.fc1(x))
        x = self.fc2(x)
        return x

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 01:35:16