基于自定义骨骼数据的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
相关产品推荐
相关产品推荐

