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

如何在PyTorch中按苹果样本组划分图像数据集为训练/验证集

PyTorch中按苹果整体划分训练/验证集的实现方法

要实现每个苹果的6张图像作为整体划分,核心思路是先按苹果ID分组,再对苹果分组进行训练/验证划分,而非直接拆分单个样本。具体步骤如下:

1. 读取数据集并按苹果分组

先用Pandas读取CSV文件,通过Apple字段将同属一个苹果的所有样本归为一组:

import pandas as pd

# 读取CSV数据集
df = pd.read_csv("your_dataset.csv")
# 按Apple字段分组,得到每个苹果对应的所有样本索引
apple_groups = df.groupby("Apple").groups
# 提取所有苹果的唯一ID列表
apple_unique_ids = list(apple_groups.keys())

2. 划分训练/验证用的苹果ID

对苹果的唯一ID进行划分,确保每个苹果整体进入训练或验证集:

from sklearn.model_selection import train_test_split

# 按8:2比例划分苹果ID,random_state保证划分可复现
train_apple_ids, val_apple_ids = train_test_split(
    apple_unique_ids, test_size=0.2, random_state=42
)

如果不想依赖sklearn,也可以手动随机划分:

import random

random.seed(42)
random.shuffle(apple_unique_ids)
split_idx = int(len(apple_unique_ids) * 0.8)
train_apple_ids = apple_unique_ids[:split_idx]
val_apple_ids = apple_unique_ids[split_idx:]

3. 生成训练/验证集的样本索引

将划分好的苹果ID对应的所有样本索引收集起来:

# 收集训练集所有样本的索引
train_indices = []
for apple_id in train_apple_ids:
    train_indices.extend(apple_groups[apple_id])

# 收集验证集所有样本的索引
val_indices = []
for apple_id in val_apple_ids:
    val_indices.extend(apple_groups[apple_id])

4. 用PyTorch Subset创建数据集

基于自定义数据集类,通过Subset快速生成训练和验证集:

from torch.utils.data import Dataset, Subset

# 自定义苹果数据集类(根据你的实际需求调整)
class AppleDataset(Dataset):
    def __init__(self, csv_path):
        self.df = pd.read_csv(csv_path)
        # 可在此提前加载图像路径、预处理配置等

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

    def __getitem__(self, idx):
        # 根据索引获取单样本数据:图像、糖度标签等
        row = self.df.iloc[idx]
        img_path = row["image_path"]
        sugar_level = row["sugar_content"]
        # 此处添加图像加载、预处理逻辑
        # img = load_and_preprocess(img_path)
        return img, sugar_level

# 创建完整数据集
full_dataset = AppleDataset("your_dataset.csv")

# 生成训练集和验证集
train_dataset = Subset(full_dataset, train_indices)
val_dataset = Subset(full_dataset, val_indices)

5. 用DataLoader加载数据集

最后用PyTorch的DataLoader封装,用于模型训练:

from torch.utils.data import DataLoader

train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)
val_loader = DataLoader(val_dataset, batch_size=32, shuffle=False)

关键说明

这种方式的核心是以苹果为单位划分,避免了单个苹果的图像被拆分到不同集合,完全符合你的需求。如果需要调整划分比例,只需修改test_size参数或手动拆分的比例即可。

内容的提问来源于stack exchange,提问作者M.K.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 00:20:38