深度学习pytorch分割数据集的方法(将大数据集改小更加易于训练)||图像分类

问题一:划分训练集和验证集:

import os
from shutil import copy, rmtree
import random


def mk_file(file_path: str):
    if os.path.exists(file_path):
        # 如果文件夹存在,则先删除原文件夹在重新创建
        rmtree(file_path)
    os.makedirs(file_path)


def main():
    # 保证随机可复现
    random.seed(0)

    # 将数据集中10%的数据划分到验证集中
    split_rate = 0.1

    # 指向你解压后的flower_photos文件夹
    cwd = os.getcwd()
    data_root = os.path.join(cwd, "my_data3")
    origin_flower_path = os.path.join(data_root, "images")
    assert os.path.exists(origin_flower_path), "path '{}' does not exist.".format(origin_flower_path)

    flower_class = [cla for cla in os.listdir(origin_flower_path)
                    if os.path.isdir(os.path.join(origin_flower_path, cla))]

    # 建立保存训练集的文件夹
    train_root = os.path.join(data_root, "train")
    mk_file(train_root)
    for cla in flower_class:
        # 建立每个类别对应的文件夹
        mk_file(os.path.join(train_root, cla))

    # 建立保存验证集的文件夹
    val_root = os.path.join(data_root, "val")
    mk_file(val_root)
    for cla in flower_class:
        # 建立每个类别对应的文件夹
        mk_file(os.path.join(val_root, cla))

    for cla in flower_class:
        cla_path = os.path.join(origin_flower_path, cla)
        images = os.listdir(cla_path)
        num = len(images)
        # 随机采样验证集的索引
        eval_index = random.sample(images, k=int(num*split_rate))
        for index, image in enumerate(images):
            if image in eval_index:
                # 将分配至验证集中的文件复制到相应目录
                image_path = os.path.join(cla_path, image)
                new_path = os.path.join(val_root, cla)
                copy(image_path, new_path)
            else:
                # 将分配至训练集中的文件复制到相应目录
                image_path = os.path.join(cla_path, image)
                new_path = os.path.join(train_root, cla)
                copy(image_path, new_path)
            print("\r[{}] processing [{}/{}]".format(cla, index+1, num), end="")  # processing bar
        print()

    print("processing done!")


if __name__ == '__main__':
    main()

当由于硬件设备的影响或者计算量参数的庞大可以使用以下方法,适当的减少数据量以方便进行训练:

方法1.如果是标准的数据集:(文件每组分类都有规定的图片)

可以随机删除一些数据

import os
import random

def delete_images(dir_path, num_to_delete):
    # 获取目录中的所有文件
    files = os.listdir(dir_path)
    # 过滤出图像文件
    image_files = [f for f in files if f.endswith('.jpg') or f.endswith('.png')]
    # 如果要删除的图片数量大于图片总数,则只删除所有图片
    num_to_delete = min(num_to_delete, len(image_files))
    # 随机选择要删除的图片
    images_to_delete = random.sample(image_files, num_to_delete)
    # 删除图片
    for image in images_to_delete:
        os.remove(os.path.join(dir_path, image))

# 使用示例:从当前目录中删除 5 张图片
delete_images(r'F:\Python\BCNN\鸟类细粒度分类\my_data\images\010.Red_winged_Blackbird', 20)

方法二:如果是torchvision里面的数据集,比如

 trainset = datasets.CIFAR10(root=image_path,train=True,download=False,
                                transform=data_transform['train'])

 分割数据集可以采用:

  • class torch.utils.data.Subset(dataset, indices): 获取指定一个索引序列对应的子数据集。

 代码实操:

    trainset1 = datasets.CIFAR10(root=image_path,train=True,download=False,
                                transform=data_transform['train'])
    # 定义索引列表,选择前5000张图像进行训练
    subset_indices1 = list(range(10000))
    trainset = Subset(trainset1, subset_indices1)
    trainloader = DataLoader(trainset, batch_size=batch_size,
                                             shuffle=True, num_workers=0)
    # 将class_to_idx属性添加到Subset对象中
    trainset.class_to_idx = trainset1.class_to_idx
    train_steps = len(trainloader)
    print(train_steps)
    testset1 = datasets.CIFAR10(root=image_path,train=False,download=False,
                               transform=data_transform['val'])
    subset_indices2 = list(range(2000))
    testset = Subset(testset1, subset_indices2)

    testloader = DataLoader(testset, batch_size=batch_size,
                                             shuffle=False, num_workers=0)
    # val_steps = len(testloader)

    bird_list = trainset.class_to_idx

这里要注意的是,选择要划分的数据集后,要使用trainset.class_to_idx = trainset1.class_to_idx将class_to_idx添加到Subset对象中。

这样就可以实现指定数据集数量的选取和训练啦

参考文章:

【1】Pytorch划分数据集的方法:torch.utils.data.Subset - 爱学英语的程序媛 - 博客园 (cnblogs.com)

【2】 chatGPT 

### 回答1: 2022年10月,PyTorch深度学习框架将继续保持其在深度学习领域的领先地位。随着人工智能技术的不断发展,PyTorch将不断更新和改进,以适应新的挑战和需求。此时,PyTorch已经成为实现机器学习和深度学习的最先进、最强大的框架之一,广泛应用于各种领域,如图像识别、自然语言处理、语音识别等。 随着深度学习技术的普及和不断发展,PyTorch将不断优化其已有的功能和性能,提供更多的高级算法和工具。这将使得开发者可以更加轻松地实现更为复杂和精细的深度学习模型,从而提高机器学习的效率和精度。另外,PyTorch还将与其他先进技术结合,比如对抗生成网络(GANs)和强化学习,以实现更为高级的应用。 2022年10月,PyTorch深度学习框架还将更加注重安全和隐私保护,增加安全性和使用方便性,为用户提供更为广泛的应用场景。同时,PyTorch团队将持续进行社区建设,与全球的开发者和研究者合作,探索更具前瞻性的深度学习技术和应用。这将为2022年和未来的深度学习领域带来更多的新机遇和挑战。 ### 回答2: pytorch是一个开源机器学习框架,广泛应用于深度学习领域。随着人工智能和机器学习技术的不断进步,pytorch也在不断发展和完善。到2022年10月,pytorch肯定会有更多强大的功能和特性。 在未来,pytorch会更加注重开发人员的使用体验,提供更加易用和便捷的API和工具。同时,pytorch也将进一步推进自动化领域的研究和开发,自动化超参数、模型结构等方面的选择,不仅能够大幅提高模型训练的效率,同时也能够减少人工智能研究者的工作量和时间成本。 随着AI和大数据技术的不断发展,pytorch也会更加注重数据处理和分析能力,在大规模数据集和复杂任务下进行更加高效、准确和可靠的数据分析和处理。 总之,pytorch作为深度学习领域的知名框架,将会不断发展和完善,为广大人工智能开发者和研究人员带来更加优秀的工具和平台,助力科学家们实现更多技术的创新和改变。 ### 回答3: 2022年10月,PyTorch深度学习已经成为当今最受欢迎和使用的深度学习框架之一。PyTorch是一个由Facebook开发和维护的开源深度学习框架,它具有高度的灵活性、易于使用和热门的社区支持,而且在深度学习域内受到了广泛的认可。 在2022年10月,PyTorch深度学习应用已开始深入我们的生活和工作领域,它被应用于各种各样的领域,包括计算机视觉、自然语言处理、自动驾驶、医疗诊断等。 在计算机视觉领域,PyTorch深度学习被广泛应用于图像分类和目标检测,例如使用Convolutional Neural Network (CNN)实现人脸识别和图像分割。 在自然语言处理领域,PyTorch深度学习可用于文本分类、情感分析、机器翻译等任务,以及生成模型的研究和开发。 在自动驾驶领域,PyTorch深度学习可以用于道路识别、车辆识别和自动驾驶决策的学习和优化等。 在医疗诊断领域,PyTorch深度学习被应用于疾病识别、医学影像分类等任务中,帮助医生进行更准确、及时、可靠的诊断。 因此,可以预见,在2022年10月,PyTorch深度学习将继续在其应用范围和影响力上发挥着重大的作用,它将继续为深度学习领域带来更多的创新和进步。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值