半监督

实际上就是在加载dataloader那里做了调整,采样器

这段代码定义了一个名为create_data_loaders的函数,用于创建训练集和验证集的数据加载器。

def create_data_loaders(train_transform, eval_transform, datadir, config):
    traindir = os.path.join(datadir, config.train_subdir)
    trainset = torchvision.datasets.ImageFolder(traindir, train_transform)

首先,将训练集的路径拼接起来,然后使用torchvision.datasets.ImageFolder函数加载训练集。ImageFolder是一个用于处理图像文件夹数据集的类,它假设图像文件夹的结构是按照类别分组的,每个类别的图像放在对应的子文件夹中。

    if config.labels:
        with open(config.labels) as f:
            labels = dict(line.split(' ') for line in f.read().splitlines())
        labeled_idxs, unlabeled_idxs = datasets.relabel_dataset(trainset, labels)

如果配置中提供了标签文件的路径config.labels,则打开标签文件并将其读取为一个字典。标签文件中的每一行包含图像文件名和对应的标签,通过空格分隔。relabel_dataset函数根据标签文件将训练集中的样本分为有标签和无标签样本,并返回有标签样本的索引和无标签样本的索引。

    assert len(trainset.imgs) == len(labeled_idxs) + len(unlabeled_idxs)

确保有标签样本和无标签样本的数量与训练集中的总样本数量相等。

    if config.labeled_batch_size < config.batch_size:
        assert len(unlabeled_idxs) > 0
        batch_sampler = datasets.TwoStreamBatchSampler(unlabeled_idxs, labeled_idxs, config.batch_size, config.labeled_batch_size)
    else:
        sampler = SubsetRandomSampler(labeled_idxs)
        batch_sampler = BatchSampler(sampler, config.batch_size, drop_last=True)

根据配置中的有标签批次大小config.labeled_batch_size和总批次大小config.batch_size,决定使用哪种批次采样方式。如果有标签批次大小小于总批次大小,将使用datasets.TwoStreamBatchSampler创建一个两流批次采样器,该采样器在每个批次中同时包含有标签和无标签样本。否则,将使用SubsetRandomSampler创建一个只包含有标签样本的采样器。

    train_loader = torch.utils.data.DataLoader(trainset, batch_sampler=batch_sampler, num_workers=config.workers, pin_memory=True)

使用torch.utils.data.DataLoader创建训练集的数据加载器,其中采用了上面创建的批次采样器。num_workers参数指定了用于数据加载的子进程数量,pin_memory=True表示将数据加载到固定的内存区域,可以加速数据传输。

    evaldir = os.path.join(datadir, config.eval_subdir)
    evalset = torchvision.datasets.ImageFolder(evaldir, eval_transform)
    eval_loader = torch.utils.data.DataLoader(evalset, batch_size=config.batch_size, shuffle=False, num_workers=2*config.workers, pin_memory=True, drop_last=False)

接下来,将验证集的路径拼接起来,然后使用torchvision.datasets.ImageFolder加载验证集。与训练集类似,也使用torch.utils.data.DataLoader创建验证集的数据加载器。

最后,将训练集和验证集的数据加载器作为结果返回。

这段代码的作用是根据配置中的设置,创建训练集和验证集的数据加载器。在半监督学习中,训练集中的样本被分为有标签和无标签样本,并使用不同的批次采样方式对它们进行训练。

相关推荐
肥猪猪爸11 分钟前
使用卡尔曼滤波器估计pybullet中的机器人位置
数据结构·人工智能·python·算法·机器人·卡尔曼滤波·pybullet
readmancynn23 分钟前
二分基本实现
数据结构·算法
萝卜兽编程26 分钟前
优先级队列
c++·算法
盼海33 分钟前
排序算法(四)--快速排序
数据结构·算法·排序算法
LZXCyrus40 分钟前
【杂记】vLLM如何指定GPU单卡/多卡离线推理
人工智能·经验分享·python·深度学习·语言模型·llm·vllm
Enougme43 分钟前
Appium常用的使用方法(一)
python·appium
一直学习永不止步1 小时前
LeetCode题练习与总结:最长回文串--409
java·数据结构·算法·leetcode·字符串·贪心·哈希表
懷淰メ1 小时前
PyQt飞机大战游戏(附下载地址)
开发语言·python·qt·游戏·pyqt·游戏开发·pyqt5
我感觉。1 小时前
【机器学习chp4】特征工程
人工智能·机器学习·主成分分析·特征工程
hummhumm1 小时前
第 22 章 - Go语言 测试与基准测试
java·大数据·开发语言·前端·python·golang·log4j