手撕Pytorch源码#1.Dataset类 part1

news2024/11/26 13:46:38

写在前面

  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 NotImplementedError

    def __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<typename T>,即定义类模板时不显示指定参数类比,而是在实际实例化时再进行指定

  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):
    pass

T = TypeVar("T")
T_co = TypeVar("T_co",covariant = True)

class Renderizador(Generic[T_co]):
    def __init__(self,x:T_co)->None:
        pass

def exe_render(render:Renderizator[Cubo]):
    pass

render_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<typename T>

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():
    pass

def func():
    pass

a = 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类型,即函数或类

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/167729.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PHP MySQL 插入多条数据

使用 MySQLi 和 PDO 向 MySQL 插入多条数据 mysqli_multi_query() 函数可用来执行多条SQL语句。 以下实例向 "MyGuests" 表添加了三条新的记录: 实例 (MySQLi - 面向对象) <?php $servername "localhost"; $username "username"; $pas…

MWORKS 2023a 已上线!

同元软控不断打磨MWORKS产品&#xff0c;持续精进&#xff0c;于1月8日正式发布科学计算与系统建模仿真平台MWORKS 2023a。 欢迎大家前往同元软控官网下载MWORKS 2023a软件进行试用。我们在官网新增反馈问题入口&#xff0c;也欢迎大家提交工单以反馈产品建议。 1.MWORKS官方软…

FPGA:Vivado基于IP集成的计数器设计(3)

本节利用上一节创建和封装的ls61和ls00两个IP核。采用原理图设计的方式实现一个模9计数器&#xff0c;讲解IP核集成的Vivado设计流程。 &#xff08;1&#xff09;创建工程 创建一个名为count_bd的新工程&#xff0c;存于F:\FPGA\FPGAproject\exam文件夹下&#xff1b; &…

用 Goby 通过反序列化漏洞一键打入内存马【利用篇】

Goby 社区第 22 篇技术分享文章全文共&#xff1a;3734 字 预计阅读时间&#xff1a;10 分钟001 前言 在上一篇《Shell中的幽灵王者—JAVAWEB 内存马 【认知篇】》中&#xff0c;我从概念上介绍了很多内存马的东西&#xff0c;并给出了我的观点&#xff1a;“大势所趋下&#…

dvwa中的xss(跨站脚本)攻击

环境&#xff1a;dvwa: 192.168.11.135 dvwa版本&#xff1a; Version 1.9 (Release date: 2015-09-19)kail机器&#xff1a;192.168.11.156 一、XSS是什么XSS&#xff08;Cross Site Scripting&#xff0c;跨站脚本攻击&#xff09;&#xff0c;是指恶意攻击者往web页面里插入…

2003-2019年各省数据GDP、人均GDP、城镇化率、年末人口数、人口自然增长率

2003-2019年各省数据GDP、人均GDP、城镇化率、年末人口数、人口自然增长率 1、时间&#xff1a;2003-2019年 2、来源整理自统计NJ、各省NJ 3、指标包括&#xff1a;GDP、人均GDP、城镇化率、年末人口数、人口自然增长率 4、包括&#xff1a;31省 5、指标解释&#xff1a; …

2023届计算机专业弄潮儿如何快速找毕业论文文献?

人生苦短&#xff0c;我用Python 一、准备工作 软件选择 Python3.8pycharm 模块 requests #模拟请求 Selenium # 浏览器自动化操作winr打开搜索框&#xff0c;输入cmd按确定打开命令提示符窗口&#xff0c;输入pip install 加上你要安装的模块名&#xff0c; 回车即可安…

uml图 各连接线的含义

目录UML类图六种关系的总结1.泛化&#xff08;Generalization&#xff09;2.实现&#xff08;Realization&#xff09;3.关联&#xff08;Association&#xff09;4.聚合&#xff08;Aggregation&#xff09;5.组合&#xff08;Composition&#xff09;6.依赖&#xff08;Depen…

渗透学习-学习记录-利用浏览器的开发者工具实时修改网页前端JS代码(实现绕过)

文章目录前言一、JS前端的修改前言 最近学习了一些有关于JS脚本搭建网站方面的安全知识。通常来说JS是前端的页面代码&#xff0c;因此我们可以直接修改前端的JS代码来实现绕过&#xff0c;故我试着做了一下利用浏览器的开发者工具进行尝试修改页面&#xff0c;以此来直接进行…

<Python>使用python来控制windows系统音量

使用python可以对windows系统的音量进行读取或者设置。 平台&#xff1a;visual studio code 语言&#xff1a;python 需要的python模块&#xff1a; 1、pyqt5 2、ctypes&#xff1a; ctypes 是 Python 的外部函数库。它提供了与 C 兼容的数据类型&#xff0c;并允许调用 DLL …

中国芯,SNS521系列水燃行业云芯产品获奖

近日&#xff0c;由运营商财经网举办的2023中国财经TMT“领秀榜”盛典召开&#xff0c;天翼物联连获四个奖项&#xff0c;分别是&#xff1a;2022年度优秀物联网企业、2022年度5G最佳实践引领企业、2022年度运营商科技创新引领企业以及“SNS521系列水燃行业云芯产品”获2022年度…

命名空间!C++之路扬帆起航

&#x1f451;专栏内容&#xff1a;C学习笔记⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;日拱一卒&#xff0c;功不唐捐 目录一、前言二、命名空间1、命名空间的定义Ⅰ、正常定义Ⅱ、嵌套定义Ⅲ、不连续定义2、命名空间的使用Ⅰ、域解析操作符Ⅱ、us…

工作流代码

工作流代码目录概述需求&#xff1a;设计思路实现思路分析1.at parata:2.cash20193.cashEntity4.cashFrmTemplate5.chartType:参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make…

分享85个PHP源码,总有一款适合您

PHP源码 分享85个PHP源码&#xff0c;总有一款适合您 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c;大家下载后可以看到。 源码下载链接&#xff1a;https://pan.baidu.com/s/1606ndyliGtwnjU8vsCLGRg?pwdq0k2 提…

MyBatis -- 参数占位符 #{} 和 ${}

MyBatis -- 参数占位符 #{} 和 ${}一、准备工作二、参数占位符 #{} 和 ${}三、特殊场景3.1 特殊场景 1 -- String3.1.1 使用 #{}3.1.2 使用 ${}3.1.3 分析与解决3.2 特殊场景 2 -- MySQL 关键字3.3 特殊场景 3 -- SQL 注入问题 (重要)3.4 特殊场景 4 -- 模糊查询 like一、准备工…

测试开发 | 想测试入门就必须要懂的软件开发流程

本文节选自霍格沃兹测试学院内部教材 从事软件测试行业&#xff0c;每天面对的被测对象都是软件。如果想要更好的去完成测试工作&#xff0c;首先需要对被测对象&#xff0c;也就是对软件要有基本的了解。 软件 与计算机系统操作有关的计算机程序、可能有的文件、文档及数据。…

多轮对话(二):多轮对话理解的研究进展和主流方法

本文是基于 Advances in Multi-turn Dialogue Comprehension: A Survey。这是一篇综述论文&#xff0c;我也顺便总结一下像我一样的小白&#xff0c;怎么读综述好一些。我读综述是为了快速切入某领域&#xff0c;比如我以前做的是跨模态检索&#xff0c;现在要进入对话系统&…

C++STL-stackqueue的实现

文章目录1. deque的简单介绍1.1 deque的原理介绍1.2 deque的优缺点1.3 为什么选择deque作为底层默认容器2. stack的实现3. queue的实现1. deque的简单介绍 在前面已经介绍过&#xff0c;stack和queue这两个容器适配器&#xff0c;是由deque这个容器封装的。现在我们就需要先学…

易观千帆 | 11月用户体验GX评测:银行APP用户体验稳定提升,从流量竞争逐渐转向用户体验竞争

易观&#xff1a;随着银行行业对用户体验的重视&#xff0c;手机银行APP用户体验稳定提升&#xff0c;竞争也从注重MAU的流量竞争逐渐转移为用户体验竞争。11月易观千帆用户体验GX评测显示&#xff0c;平安口袋银行、中国工商银行、招商银行仍是AAAAA级&#xff0c;在用户体验维…

对于搞钱我们是认真的

前言 大家好&#xff0c;我是xiezhr。一提到搞钱&#xff0c;想必大家都非常非常感兴趣&#xff0c;立马就精神抖擞了。说实话&#xff0c;在这疫情爆发这几年里&#xff0c;赚点钱真不容易。 不知道你是不是也跟我一样&#xff0c;一个人在夜深人静的时候就在想怎么才能通过自…