版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、python部分代码分析曹春水中国科技技术大学&中科院自动化研究所注:文档中难免可能有些理解错误,给出的解释仅供参考。望多指正。我的邮箱是: python部分代码分析1.全局文件一览在 cuda-convnet 上下载的代码中,python 部分的代码一共有九个.py 文件,下面表格描述了每个文件的作用。文件说明data.py dataprovider 类及其子类的定义文件convdata.py cifar10 等数据库的dataprovider 类定义options.py 用户输入参数分析类的定义layer.py 用户提供的层配置文件的分析类的定义gpumodel.py 模型类,用于
2、统筹各方数据convent.py 模型类的子类,也是主程序所在的文件夹shownet.py 网络显示程序(本文档中不做分析)ordereddict.py 有序字典定义(本文档中不做分析)util.py 一些通用函数定义上述文件中,有关类的定义文件里,都有很多类及其子类的定义。另外,当需要使用本网络时,也可以自己增加.py 文件来达到自己的目的。2.各类的具体分析2.1 util.py文件分析这个文件定义了一些系统级的,共用性的函数,功能如下:函数接口作用说明1 def get_gpu_lock(id=-1) 获取锁定的gpu的 idx 2 pickle(filename, data, comp
3、ress=false) 将 data 序列化后存入filename 指定的路径的文件中, 如果 data 有压缩, 则解压缩后在pickle,后存入filename 中3 unpickle(filename)与 pickle函数相反,读取filename文件,然后,若压缩则解压缩,然后恢复成原来的python对象并返回4 flatten_list(li)对 li 列表进行拉直,然后返回拉直后的list对象5 其余函数并不重要,不做过多解释补充知识:关于 python 的数据序列化(pickle)操作平时我们理解的存储在磁盘中的数据大多感觉就是裸数据,存储的数据是独立于对这些数据进行操作的对象和
4、程序的。这样做的好处是,数据可以作为共享的资源,供其它应用程序使用。缺点是,用这种方式,可以允许其它程序访问对象的数据,这违背了面向对象的封装性原则 即对象的数据只能通过这个对象自身的公共(public )接口来访问。如果希望透明地存储python 对象, 而不丢失其身份和类型等信息,则需要某种形式的对象序列化:它是一个将任意复杂的对象转成对象的文本或二进制表示的过程。同样,必须能够将对象经过序列化后的形式恢复到原有的对象。在python 中,这种序列化过程称为pickle ,可以将对象pickle 成字符串、磁盘上的文件或者任何类似于文件的对象,也可以将这些字符串、文件或任何类似于文件的对象
5、unpickle 成原来的对象。所以可以这么理解,想要存储 python 的字典对象, 并且要求能够恢复成字典对象,那么就需要pickle 和 unpickle. pickle 模块及其同类模块cpickle 向 python 提供了pickle 支持。后者是用c 编码的,它具有更好的性能,对于大多数应用程序,推荐使用该模块。 pickle 模块中的两个主要函数是dump() 和 load() 。dump() 函数接受一个文件句柄和一个数据对象作为参数,把数据对象以特定的格式保存到给定的文件中。当我们使用load() 函数从文件中取出已保存的对象时,pickle知道如何恢复这些对象到它们本来的
6、格式。2.2 gpumodel&convnet类分析gpumodel 类是整个python 代码的核心,它负责数据的收集(包括图片数据,用户参数数据,层配置数据,checkpoint 数据),将数据传送给c+代码,启动c+代码,让c+代码按照用户要求运行,包括创建指定网络,训练,测试,cpu 与 gpu 数据同步,网络状态的保存,网络运行信息的打印等等。因此 python 代码中定义的很多类都是为gpumodel 类提供服务的。convnet 类是 gpumodel 的子类,复写了gpumodel 的很多方法,也有几个自己独有的方法,这里的分析主要是以convnet 复写 gpumod
7、el 方法后形成的新类的。下面给出整个代码围绕 gpumodel&convnet类的代码全局图。这里对图做一些简单的解释,图中,中间淡紫色框即为gpumodel&convnet类的类分析图,浅绿色代表了gpumodel 类定义的方法,深绿色表示gpumodel定义过但被convnet 类复写了的方法,橘黄色代表convnet 新增加的方法;gpumodel 的属性组成比较特殊,主要有三大来源:一些是来自 _init_ 定义, 一些是来自optionsparser 的 options 字典,还有一些是来自自己的字典属性model_state 的键值对, 属性繁多。由于其他类都是为
8、gpumodel 提供服务的,所以可以将gpumodel 的方法按照各自涉及的类进行分类,从图中可以看出,所有的方法被分成了六类,分别是:与dataprovider 类打交道的;与 optionsparser 类打交道的; 与 layerparser 类打交道的;与保存和读取checkpoint相关的;与创建类对象和打印信息相关的;与 c+代码打交道的。 图中的小手指示了gpumodel在需要获取数据时分别是调用哪些函数来达到目的。另外图中也给出了各个环节数据的类型信息,可以看出, 在 python 代码里,复杂数据多是用字典方式进行存储的。sync_with_host train scale
9、_learningrate start init_model_lib import_model finish_batch start_batch get_test_error load_checkpoint save_state conditional_save init_data_providers parse_batch_data get_next_batch print_data_providers fill_excused_options get_options_parser parse_options init print_train_results print_train_time
10、 print_model_state print_iteration aggregate_test_outputs print_test_results print_costs init_model_state get_layer_idx 属性含义model_name 模型的名字op optionsparser 对象options 选项参数集合load_dic checkpoint 字典dp_params dataprovider 额外参数属性来自model_state所有的键值对来自 op 对象的options字典的所 有 键 和 值 作为 model 的属性属性model_state字典:
11、模型的状态字典gpumodel 类(convnet是子类 ) 图片 batch 数据dataprovider data 字典curr_epoch curr_batchnum data_dic两个层配置文件layerparser layers列表layer1 字典 . layern字典终端用户设置参数optionsparser optionsparser类对象options 字典checkpoint 文件checkpoint 字典模型的 optionsparser 对象 op 模 型的状态字典:model_state 衔接程序(服务清单)pyconvnet.cu initmodel startb
12、atch finishbatch checkgradients startmultiviewtest startfeaturewriter syncwithhost c+/cuda c 线程程序实现数据,包括图片数据,层字典列表都是以原来 python 的数据格式交个c+代码的, c+代码拿到这些数据后,有一个专门的函数文件从其中获得c+能接受的数据格式,参见util.cu文件代码全局图由于类的方法数量众多,这里不作一一分析, 类方法的功能大多可以从其函数名称看出。这里只对gpumodel 类初始化过程进行分析,也就是init 函数:gpumodel.init() 设置属性:self.mode
13、l_name = model_name# 模型的名字,如convnet self.op = op#选项参数, optionsparser 对象self.options = op.options# 选项参数集合self.load_dic = load_dic# 存储模型运行状态的字典,主要就是checkpoint,checkpoint 文件中有两项东西:保存的optionsparser 对象 op,以及 modelstate self.filename_options = filename_options#有关存储checkpoint 数据文件名字的选项self.dp_params = dp_p
14、arams#dataprovider 的额外参数:比如是否裁剪, 是否 multiview-test ,以及 label-scale 等等获取 gpu信息,根据是否是梯度检验填写一些默认参数:self.get_gpus() self.fill_excused_options() 将 optionsparser的 options字典中所有的键和值设置为model 的属性:读取以及设置checkpoint的存储路径,初步设置modelstate 初始化 dataprovider:根据用户设置的一些参数信息调用dataporvider 类方法 get_instance 创建训练数据和测试数据data
15、provider 实例对象初始化模型状态,设置 modelstate 字典,该字典中包含以下信息: layers列表将调用layersparser的类方法parse_layers 获得,另外还将完成卷积层的类型转换以及权重矩阵初始化model_state train_outputs test_outputs epoch batchnum layers(层字典列表 ) 将 model_state 的键值对设置为gpumodel 的属性导入 c+库模块 ,主要就是pyconvnet.cu 文件启动 c+线程程序, 调用 initmodel 函数创建整个网络模型2.3dataprovider类分析2
16、.3.1 类图2.3.2 图片数据信息回顾我们已经知道,经过数据准备,所有的图片已经被整理成一个一个batch 存放在某个目录下了,假设data_dir 是 batch 数据所在的文件夹,如下是文件夹下的图示:batch_meta data_batch_01 data_batch_02 data_batch_03 data_batch_04 data_batch_05 data_batch_06 下面回顾一下batch_meta 以及 data_batch_xx 中存放的信息:文件中存储的数据信息batch_meta (字典 ) data_batch_x (字典 ) 变量名类型变量名类型dat
17、a_sum listbatch_label listdata_mean listdata listlabel_names listlabels listnum_cases_per_batch intfilenames listnum_vis intfileidx list其余信息如 dp_type(数据提供者类型)等等2.3.3 类方法分析和与gpumodel交互过程dataprovider 的类方法很多, 但我们知道, dataprovider 主要是跟batch_meta,data_batch_x以及 gpumodel 打交道的,因此,我们可以根据打交道的对象不同对这些类方法进行一个分类,
18、下面给出分类以及函数作用说明,表格中的蓝色箭头表示调用关系a-b 表示 a 被 b 调用:针对 batch_meta:函数名称工作过程及作用get_batch_meta(data_dir) 通过系统函数和upickle 函数得到batch_meta 字典get_data_dims(self) 获得 batch_meta 字典 的 num_vis 属性,即一张图片的大小针对 所有的 batch:函数名称工作过程及作用get_batch_filenames(srcdir): 获取路径下所有batch 的名字组成的列表get_batch_nums(srcdir) 获得所有 batch 名字中的数字比
19、如:01,02,03, 区别与 batch 的 idx: 1,2,3,因为有的可能是0001,0002,0003,这样的get_num_batches 获得 batch 的总数针对 当前的 batch:函数名称工作过程及作用get_data_file_name(self, batchnum=none) 获得一个当前batch(默认 ),或者具体某个 batch 的完整路径get_batch(self, batch_num) 获得指定batch_num的data_batch_x 字典针对 next_batch:函数名称工作过程及作用get_next_batch_idx(self) 获得下一个ba
20、tch 的 idx get_next_batch_num 获得下一个batch 的名字advance_batch(self) 更新当前provider 的一些属性:self.batch_idx,self.curr_batchnum ,self.curr_epoch get_next_batch(self) 当self.data_dic is none or len(self.batch_range) 1 时,就当前batch 字典为空, 或者 batch 个数 1,则按照当前要读的batch_num 读取batch到self.data_dic,调用advance_batch 为下一个batch
21、 的读入做准备针对全局变量dp_type,dp_classes :函数名称工作过程及作用register_data_provider(cls, name, desc, _class) 将 type 为 desc, 键值为 name 的 type加入 dp_type 中, 将 type 为_class,键 值 为name的class加 入dp_classes中,get_instance(cls, data_dir, batch_range=none, init_epoch=1, init_batchnum=none, dp_type=default, dp_params=, test=false
22、, batch_meta_path=none) 获得指定的dataprovder 下面给出dataprvider 与 gpumodel 的交互过程示意图,图中包含一些重要属性的意义解释:batch_meta data_batch_01 data_batch_02 data_batch_03 data_batch_04 data_batch_05 data_batch_06 advance_batch(self) 更新当前provider 的self.batch_idx self.curr_batchnum self.curr_epoch get_next_batch(self) self.da
23、ta_dir 存储路径self.batch_range batch 的个数范围self.dp_params prvider 的一些额外参数self.test = test 数据用途,测试或者训练self.batch_idx 当前 batch 的索引号self.batch_meta 字典,装的是 batch_metaself.data_dic = 字典,装的是 data_batchself.curr_batchnum 当 前batch 的编号self.curr_epoch 当期周期数其他类成员方法打 包 成一 个 字典model 调用交给模型在返回字典给模型前,函数总会先调用 advance_b
24、atch,为下次做好准备2.4 options类分析2.4.1 类图这一类的主要功能是为模型以及整个代码设定参数用的,比如数据存储路径,模型使用的 dataprovider 类型, 层配置文件的路径等等。gpumodel 会调用 options 中的函数创建一个参数菜单,一部分无默认值的是需要用户给的,通过终端输入,options中会有函数对输入进行分析,大部分都有默认值,用户也可以改变。下面给出这一类的类图:2.4.2 工作过程如上面所述, options 主要是为模型和程序提供参数的,当用户给出一个参数时,对一个参数需要分析的任务包括:1.是否有该参数,也就是用户使用的参数名字是否正确2.
25、该参数的用户的设定值是否合法,比如是否是给定格式的,或者是否在某一个范围呢,或者是否被某些特殊的数整除等等代码中 ,把一个参数以及对这个参数进行设置,分析等的行为封装成了一个叫option的类,也就是说一个参数就是一个option 类的具体对象,参数的名称,值的类型,值对应的分析器都可以选择,因此用户可以自己增加参数,值分析器是判断所设的值是否符合某种类型用的,比如整数分析器就是判断值是否为整数类型的,从类图可以看出,值分析器很多。下面给出options 类工作过程示意图:由各自参数的optionparser来完成,种类很多,如整数分析器,字符串分析器等等选择在参数菜单上有的参数,参数菜单是一
26、个参数类对象组成的字典option 1 option 2 option 3 option m 对每个参数用户给出的值,利用各自定义好的parser 进行分析,符合规则,则将参数菜单上的对应选项设置为该值,否则抛出异常option 1=v1 option 2=v2 option 3=v3 option m=vm option m+1=vm+1 option n=vn 对用户未设置的参数设置默认值,如果必须用户给出设置的参数用户未给出,则抛出异常option 1=v1 option 2=v2 option 3=v3 option m=vm option m+1=vm+1 option n=vn 将
27、 optionsparser 对象交给模型,内含该字典用户在终端给定的参数v1 是否合法是option 1=v1 option 2=v2 option 3=v3 option m=vm 模型需要的参数集合,形式为一个字典2.4.3 详细分析这里只对 option 类与 optionsparser 类做分析,其余类重要性次之,可酌情查看。首先对于 option 类,其属性与方法的具体作用如下:参数 option 作为一个对象属性含义self.letter 从命令行读入的字符串 对应的参数的名字self.desc 参数描述信息字符串self.parser 使用的分析器self.s
28、et_once 是否设置过self.default 该选项参数的默认值self.excuses 是一个列表,存放梯度校验时免赋值的参数self.requires 是一个列表,存放模型必须设置的参数self.save self.value 该选项参数的值self.value_given = false 值是否给出,默认为未给self.prefixed_letter = min(2, len(letter) * - + letter s短选项为一个-,长选项为两个- 方法含义_init_ set_value(self, value, parse=true) 是否选择分析,如果选择,值可能被不合法时
29、可能被设置外i默认值,不选择的话,直接设置set_default 将参数的值设置为默认值eval_expr_default(self, env) 当所给的设定值是一个数学表达式时,计算该表达式的值,然后判断是否合法get_str_value 获得字符串形式的参数的值optionsparser 类:因为 parse 函数的重要性,这里对它的工作过程给出流程图:一个以 option 的对象为元素的字典, 包含了模型所需要的所有外部参数:self.options add_option: 在字典中增加option delete_option: 在字典中删除option parse ()从终端读取参数设置,完成合法性分析,设置好参数菜单中的参数等get_options_list :以列表形式返回所有 option 一些其余维护字典o
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 7251.3-2026低压成套开关设备和控制设备第3部分:由一般人员操作的配电板(DBO)
- T/ZJJGJ 002-2024紧固件制造企业生态环境保护基本规范
- T/ICMTIA PC008-2021集成电路用硝酸
- T/CMEAS 052-2025企业职工健康管理评价指南
- T/CAS 1199-2026医疗型体重管理机构服务规范
- T/CSES 164-2024企业环境、社会、治理(ESG)信息披露指标体系
- GB/T 48218-2026工业互联网平台工业机理模型评价方法
- AI在汉语言文学中的应用
- PHP基础测试题(含详细答案)
- 幼儿园食品安全方案
- 2026年质量员之设备安装质量专业管理实务能力测试试题带答案
- 2026 劳动争议调解仲裁法测试试题及答案
- 2026年秋季小学道德与法治三年级上册(新教材)教学计划含教学进度表
- 2026年大学钻探技术(钻探施工技术)试题及答案
- 2026年天津中考英语试题【含答案】
- 2026医师定考简易程序人文考试题库及答案
- 室内装饰装修(轻钢龙骨、隔墙、吊顶)保护性拆除施工组织设计方案
- 矿区附近采空区探放水设计及安全技术措施培训
- 2026年6月英语六级真题(第一套)及答案解析
- 2026年高考贵州卷历史试卷必考题及答案
- 幼儿园课程资源本土化开发路径研究-基于幼儿园乡土课程资源案例分析深度研究
评论
0/150
提交评论