PyTorch自定义Dataset类实例化时__getitem__()方法未触发问题求助
问题原因
你对PyTorch Dataset的方法触发逻辑存在误解:__getitem__ 不会在类实例化阶段被调用,它属于懒加载接口,仅在实际读取数据的时候才会执行。__init__ 方法是实例化阶段唯一会执行的逻辑,仅用来加载数据集的元信息(比如你的csv文件读取、根路径存储都属于这一步的操作)。
触发__getitem__的正确场景
只有执行以下操作时,你写的print("GET!")才会执行:
- 主动通过下标读取数据集的单个元素:
# 实例化阶段,不会打印GET! custom_dataset = MaleFacesDataset(csv_path="你的csv文件路径", root_dir="你的图片根目录") # 主动取第0个元素,触发__getitem__,打印GET! sample = custom_dataset[0] - 将Dataset传入
DataLoader后迭代读取批次数据时,DataLoader会自动批量调用__getitem__加载数据。
你现有代码的其他问题
__init__方法中直接使用了未作为参数传入的transform变量,运行会报未定义错误,建议修改构造方法:def __init__(self, csv_file, root_dir, transform=None): self.landmarks_frame = pd.read_csv(csv_file) self.root_dir = root_dir self.transform = transform- 存在重复的Image格式转换代码,你连续两次调用
Image.fromarray处理同一份sample,属于冗余逻辑,可以删掉任意一行。
内容的提问来源于stack exchange,提问作者Avalon1511
相关产品推荐
相关产品推荐

