kwargs如何隐式传递给变量?PyTorch FashionMNIST参数传递疑问
PyTorch FashionMNIST 参数传递逻辑说明
核心原理
Python类实例化时,__new__方法仅负责创建空实例对象,所有调用时传入的位置参数、关键字参数,会在__new__执行完成后自动传递给__init__方法。你调试时看到__new__没传递kwds属于正常逻辑,参数实际是走__init__继承链完成处理的。
具体参数传递路径
FashionMNIST的继承链为FashionMNIST -> MNIST -> VisionDataset -> Dataset,你传入的transform=ToTensor()处理流程如下:
- 参数首先流入
VisionDataset基类的__init__方法,该方法显式声明了transform、target_transform、transforms三个参数,会直接将参数赋值给实例的同名属性:self.transform = transform - 后续调用数据集
__getitem__取样本时,会自动调用实例上存储的transform方法,对加载的原始PIL图片做张量转换,所以你传入的参数实际会生效。
kwds的常见读取存储位置
- 基类
__init__方法:如果继承链上的类使用**kwargs接收参数,会在__init__阶段提取合法的参数存入实例变量,不合法的多余参数会直接抛出异常。 - 子类自定义配置读取:部分数据集子类会在自己的
__init__里从kwds中提取特有配置,比如subset、year、download_url等参数,存入实例供后续逻辑使用。 - 辅助方法调用:数据集的
download()、_check_integrity()等内置辅助方法,也可能从kwds中读取重试次数、超时时间、校验规则这类配置参数。
你可以参考VisionDataset的简化实现理解逻辑:
class VisionDataset(Dataset): def __init__(self, root: str, transforms: Optional[Callable] = None, transform: Optional[Callable] = None, target_transform: Optional[Callable] = None) -> None: self.root = root self.transforms = transforms self.transform = transform self.target_transform = target_transform
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

