手撕Pytorch源码#1.Dataset类 part1
创始人
2024-05-13 01:06:28
0

写在前面

  1. 手撕Pytorch源码系列目的:

  • 通过手撕源码复习+了解高级python语法

  • 熟悉对pytorch框架的掌握

  • 在每一类完成源码分析后,会与常规深度学习训练脚本进行对照

  • 本系列预计先手撕python层源码,再进一步手撕c源码

  1. 版本信息

python:3.6.13

pytorch:1.10.2

  1. 本博文涉及python语法点

  • Generic,TypeVar泛型编程知识点

  • Type hint知识点

  • typing.Dict,typing.Callable知识点

目录

[TOC]

零、流程图

一、Dataset类

1.0 源代码
class Dataset(Generic[T_co]):functions: Dict[str, Callable] = {}def __getitem__(self, index) -> T_co:raise NotImplementedErrordef __add__(self, other: 'Dataset[T_co]') -> 'ConcatDataset[T_co]':return ConcatDataset([self, other])# No `def __len__(self)` default?# See NOTE [ Lack of Default `__len__` in Python Abstract Base Classes ]# in pytorch/torch/utils/data/sampler.py
1.1 Generic[T_co]
  1. typing.Generic类是泛型的声明,与C++语言中的泛型类似,可以用于创建类模板【见2.1节 泛型编程】

1.2functions: Dict[str, Callable] = {}
  1. :操作符:起到type hint类型提示的作用【见2.2节 Type hint】

  1. typing.Dict:字典类型说明,与dict()作用不同【见2.3节 typing.Dict】

  1. typing.Callable:可调用对象类型说明【见2.4节 typing.Callable】

1.3 __getitem__(self, index) -> T_co
  1. __getitem__方法用于直接索引对象的属性值,如list对象l = [1,2,3]可以直接使用l[0]进行索引,即是调用了__getitem__方法,而在由Dataset生成DataLoader的过程中,需要使用__getitem__

  1. ->操作符:同样起到type hint类型提示的作用,:操作符往往提示变量,或输入参数的类型,而->则提示函数返回值的类型【见2.2节 Type hint】

  1. T_co:T_co是由typing.TypeVar()生成的变量,起到泛型声明的作用【见2.1节 泛型编程】

  1. raise NotImplementedError:Dataset类需要其父类(自己定义的数据集类)实现__getitem__方法,否则就会报错(同时需要实现的还有__init__魔法方法和__len__魔法方法)

1.4 __add__(self, other: 'Dataset[T_co]') -> 'ConcatDataset[T_co]'
  1. __add__魔法方法用于直接利用+号对Dataset进行拼接,生成ConcatDataset[T_co]类对象

  1. ConcatDataset类源码见下一期博文

二、相应的python语法补充

2.1 泛型编程
  1. 相当于C++中的template,即定义类模板时不显示指定参数类比,而是在实际实例化时再进行指定

  1. T_co是由API:typing.TypeVar()实例化的对象,其定义如下:

T_co = TypeVar('T_co', covariant=True)
  • 其中'T_co'为其名称

  • covariant = True的作用如下:

from typing import TypeVar
class Figure3D():pass
class Cubo(Figure3D):pass
class CaixaDePapelao(Cubo):passT = TypeVar("T")
T_co = TypeVar("T_co",covariant = True)class Renderizador(Generic[T_co]):def __init__(self,x:T_co)->None:passdef exe_render(render:Renderizator[Cubo]):passrender_1 = Renderizador(CaixaDePapelao())
exe_render(render_1)
  • 在exe_render()函数的定义中,type hint指明输入参数为Renderizator[Cubo],而实际函数的参数是Renderizador[CaixaDePapelao]与type hint不符,但CaixaDePapelao是Cubo的子类,因而为了使得子类CaixaDePapelao也能满足type hint,需要将其TypeVar()类的covariant参数置为True。此外,默认情况下TypeVar()类参数invariant = True,即子类与父类均不满足。covariant = True仅有子类满足,countervariant = True仅有父类满足

  • 常用的typing.TypeVar()函数的用法如下:

from typing import TypeVar,Union,List
# 利用Union类声明T_1为int列表与float列表类型
T_1 = TypeVar("T_1",bound = Union[List[int],List[float]]) # 直接传参声明T_2为int类型和str类型
T_2 = TypeVar("T_2",str,int)# 不传参说明T可能是任意类型
T = TypeVar("T")
  1. 常常在定义类模板时继承typing.Generic[T_co]类,相当于C++中进行泛型声明template

2.2 Type hint
  1. 虽然python为轻类型语言,在编程时可不需要标注其类型,但在定义函数和类时,为了方便可视化,避免传参以及返回值错误,python引入了Type hint机制

  1. 对于函数的声明,常见的type hint使用如下:

def add(a:int,b:int)->int:return a+b
  • a:int,b:int说明a,b两参数为int类型,->int表示函数的返回值是int类型

2.3 typing.Dict
  1. typing.py中定义了Dict,List,Set,Callable等类,但其与函数list(),dict()等作用不同

  1. typing.Dict[]用于类型声明,不可以进行赋值和初始化,而dict()则可以用于进行初始化

# Dict用于类型的声明Type hint
functions: typing.Dict[str, Callable] = {}
# dict()用于初始化实例化一个字典
dic = dict(1="1",2="2")
2.4 typing.Callable
  1. Callable类是可调用的类型,函数与类都是可调用的类型,可以用isinstance函数进行验证

from typing import Callable
class Addtion():passdef func():passa = Addition()
b = 10
isinstance(a,Callable) # False
isinstance(Addition.Callable) # True
isinstance(func,Callable) # True
isinstance(b,Callable) # False
  1. functions: Dict[str, Callable] = {}说明该字典的key值为字符串str类型,而value值为Callable类型,即函数或类

相关内容

热门资讯

常用商务英语口语   商务英语是以适应职场生活的语言要求为目的,内容涉及到商务活动的方方面面。下面是小编收集的常用商务...
六年级上册英语第一单元练习题   一、根据要求写单词。  1.dry(反义词)__________________  2.writ...
复活节英文怎么说 复活节英文怎么说?复活节的英语翻译是什么?复活节:Easter;"Easter,anniversar...
2008年北京奥运会主题曲 2008年北京奥运会(第29届夏季奥林匹克运动会),2008年8月8日到2008年8月24日在中华人...
英语道歉信 英语道歉信15篇  在日常生活中,道歉信的使用频率越来越高,通过道歉信,我们可以更好地解释事情发生的...
六年级英语专题训练(连词成句... 六年级英语专题训练(连词成句30题)  1. have,playhouse,many,I,toy,i...
上班迟到情况说明英语   每个人都或多或少的迟到过那么几次,因为各种原因,可能生病,可能因为交通堵车,可能是因为天气冷,有...
小学英语教学论文 小学英语教学论文范文  引导语:英语教育一直都是每个家长所器重的,那么有关小学英语教学论文要怎么写呢...
英语口语学习必看的方法技巧 英语口语学习必看的方法技巧如何才能说流利的英语? 说外语时,我们主要应做到四件事:理解、回答、提问、...
四级英语作文选:Birth ... 四级英语作文范文选:Birth controlSince the Chinese Governmen...
金融专业英语面试自我介绍 金融专业英语面试自我介绍3篇  金融专业的学生面试时,面试官要求用英语做自我介绍该怎么说。下面是小编...
我的李老师走了四年级英语日记... 我的李老师走了四年级英语日记带翻译  我上了五个学期的小学却换了六任老师,李老师是带我们班最长的语文...
小学三年级英语日记带翻译捡玉... 小学三年级英语日记带翻译捡玉米  今天,我和妈妈去外婆家,外婆家有刚剥的`玉米棒上带有玉米籽,好大的...
七年级英语优秀教学设计 七年级英语优秀教学设计  作为一位兢兢业业的人民教师,常常要写一份优秀的教学设计,教学设计是把教学原...
我的英语老师作文 我的英语老师作文(通用21篇)  在日常生活或是工作学习中,大家都有写作文的经历,对作文很是熟悉吧,...
英语老师教学经验总结 英语老师教学经验总结(通用19篇)  总结是指社会团体、企业单位和个人对某一阶段的学习、工作或其完成...
初一英语暑假作业答案 初一英语暑假作业答案  英语练习一(基础训练)第一题1.D2.H3.E4.F5.I6.A7.J8.C...
大学生的英语演讲稿 大学生的英语演讲稿范文(精选10篇)  使用正确的写作思路书写演讲稿会更加事半功倍。在现实社会中,越...
VOA美国之音英语学习网址 VOA美国之音英语学习推荐网址 美国之音网站已经成为语言学习最重要的资源站点,在互联网上还有若干网站...
商务英语期末试卷 Part I Term Translation (20%)Section A: Translate ...