像dict[]一样从Class中提取元素值——__getitem__

背景

最近在看代码时,发现python中的类可以像dict一样直接取元素,这是我之前没有碰到过的。便上午查阅资料,发现原来是python类中的__getitem__方法在作怪,寻找解决方案,并记录一下。

理解 getitem 方法

原理

通过key或index获取item的语法[]只是语法小技巧。当你执行 a[i]时Python调用的方法其实是a.__getitem__(i)

一个小举例

把类(Class)想象成是一个建筑模型。在建筑的数据中包含许多属性,包括对占据每层楼公司的描述:

class Building(object):
     def __init__(self, floors):
         self._floors = [None]*floors
     def occupy(self, floor_number
### 如何加载和处理 TieredImagenet 数据集 TieredImagenet 是一个广泛用于小样本学习(Few-Shot Learning)研究的数据集,它是 ImageNet 的子集,设计目的是为了提供更复杂的类别划分以便于评估模型的泛化能力。以下是关于如何加载和处理该数据集的具体说明。 #### 1. 数据集概述 TieredImagenet 包含约 **351 类训练图像**、**97 类验证图像** 和 **160 类测试图像**,每类大约有 1300 张图片[^1]。这些类别是从原始 ImageNet 中选取并重新分组得到的,因此可以更好地模拟跨域的小样本学习任务。 #### 2. 加载数据集的方法 通常情况下,可以通过以下几种方式获取和加载 TieredImagenet: - **下载官方版本**: 可以从论文作者提供的链接或者公开存储库中下载预处理好的数据文件。 - **使用第三方工具包**: 许多开源框架已经支持直接读取此类数据集。例如 PyTorch 或 TensorFlow 社区中的扩展模块可能提供了便捷接口来简化操作过程。 对于 Python 用户来说,推荐利用 `torchvision` 库配合自定义 Dataset 类实现高效管理功能;而对于其他编程环境,则需自行解析 HDF5/JSON 等格式记录下的像素矩阵及其标签信息。 #### 3. 处理流程详解 在实际项目开发过程中,针对此特定类型的视觉识别挑战赛所涉及的主要环节如下所示: ##### (a). 预处理阶段 在此部分主要完成对原始 RGB 图片尺寸调整(Resize),颜色空间转换(Color Space Transformation)以及标准化(Normalization)等工作项。具体代码片段如下: ```python from torchvision import transforms transform = transforms.Compose([ transforms.Resize((84, 84)), # Resize images to fixed size transforms.ToTensor(), # Convert PIL image or numpy.ndarray into tensor format transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) # Normalize tensors with precomputed values over imagenet dataset. ]) ``` ##### (b). 构建Dataset & DataLoader实例对象 创建继承自 base class (`torch.utils.data.Dataset`)的新类,并重写两个核心函数——`__len__(self)` 返回总样本数,`__getitem__(self,idx)` 提供索引对应单张影像及相应标注。之后借助内置辅助组件轻松构建批量迭代器。 ```python import os from torch.utils.data import Dataset class CustomImageDataset(Dataset): def __init__(self, root_dir, transform=None): self.root_dir = root_dir self.transform = transform all_files = [] labels_map = {} for label_idx, folder_name in enumerate(os.listdir(root_dir)): current_path = os.path.join(root_dir,folder_name) if not os.path.isdir(current_path): continue files_in_folder = [os.path.join(folder_name,file_) for file_ in os.listdir(current_path)] all_files.extend(files_in_folder) labels_map.update({folder_name : label_idx}) self.image_paths = all_files self.labels_dict = {k:v for k,v in zip(all_files,[labels_map[x.split('/')[-2]] for x in all_files])} def __len__(self): return len(self.image_paths) def __getitem__(self, idx): img_loc = os.path.join(self.root_dir,self.image_paths[idx]) image = default_loader(img_loc) label = self.labels_dict[self.image_paths[idx]] if self.transform is not None: image = self.transform(image) return image, label ``` 最后一步就是实例化上述定制化的 Datasets 并传入合适的参数配置给 DataLoaders 来控制每次提取多少条目形成 mini-batch 进行后续计算啦! --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiu_cs

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值