optparse模块代码分析

​optparse --- 命令行选项的解析器​ 每个 Option 实例代表一组同义的命令行选项字符串,例如-f和--file。你可以指定任意数量的短和长选项字符串,但你必须指定总计至少一个选项字符串。创建Option的正规方式是使用的方法。option*opt_strattr=value...定义只有一个短选项字符串的选项:以及定义只有一个长选项字符串的选项:该关键字参数定义新 Option 对象的属性。最重要的选项属性是action,它主要负责确定其他的属性是相关的还是必须的。 阅读详情

optparse是标准库里用于分析命令行参数的模块(路径:/usr/lib/python2.x/optparse.py, x86-64版本的系统在lib64下)。使用它,可以让自己的程序方便地获得命令行参数,无需再自己处理了。至少也是让程序更标准化。本文首先简单介绍optparse的使用,详细用法请参照官方文档介绍。接着,详细地分析optparse如何实现这些功能的,optparse的代码结构是什么样子的。

一、 optparse模块使用简介

创建client.py,实现的功能是向server发送一个字符串信息。命令行的参数形式如下:

Usage: client.py [options] message

Options:
  -h, --help            show this help message and exit
  -p PORT, --port=PORT  port number which server listens on
  -s SERVER_ADDR, --server=SERVER_ADDR
                        server address
  -q, --quiet           don't print status message to stdout


client.py的代码内容如下:

  1 # -*- coding:utf-8 -*-
  2 # 包含中文,必须有第一行的声明。
  3 from optparse import OptionParser
  4 
  5 usage = "%prog [options] message"
  6 parser = OptionParser(usage)    #创建一个OptionParser对象(包含多个Option对象的容器)
  7 parser.add_option('-p', '--port', action='store',  #在容器对象里,添加一个Option对象
  8                   type='int', default=7890, dest='port', #选项值放在‘port’里
  9                   help='port number which server listens on')
 10 parser.add_option('-s', '--server', action='store',
 11                   type='string', dest='server_addr',  #选项值放在‘server_addr’里
 12                   help='server address')
 13 parser.add_option('-q', '--quiet', action='store_false',
 14                   dest='verbose', default=True,       #选项值放在‘verbose’里
 15                   help="don't print status message to stdout")
 16 options, args = parser.parse_args()  #解析命令行参数,将选项参数值放在options里,参数放在args里
 17 print "Server address:", options.server_addr #访问server_addr选项
 18 print "Server port   :", options.port        #访问port选项
 19 print "Verbose       :", options.verbose     #访问verbose选项
 20 print "message       :", args                #访问参数选项

以上短短几行代码就把想要的功能实现了。接下来,让我们看看它是如何做到的。


二、 optparse模块的代码分析。

分析模块的代码,首先,应该要熟悉模块的使用方法,如此才能知道代码为什么要这样做,这个很重要。再者,对于不理解的地方,可以使用import pdb做调试观察。

optparse的代码只有1703行,包含的内容不多,主要的只有Option类和OptionContainer类(容器),这也是最常被使用到的。所以,下面只介绍这两个部分。

1. Option类:

上文,我们调用parser.add_option('-p', '--port', action='store', type='int', default=7890, dest='port',  help='port number which server listens on')时,实际上就是创建一个Option类,也就是给程序创建一个选项。那么,一个选项会包含哪些东西呢?如我们调用程序时常见到的,通常有以下几种形式:

“<program> -v  -d  message"  #两个选项-v 和-d分开

”<program> -vd message" #两个选项写在一起

"<program> -f outfile"  #使用短选项-f 指定输出文件,选项名和参数用空格隔开

"<program> -foutfile"  #选项名和参数连在一起

"<program> --file outfile" #使用长选项--file指定输出文件,选项名和参数用空格隔开

"<program> --file=outfile" “选项名和参数用”=“连接

从上可以看到,一个选项通常包含一个短选项名(如”-f“),一个长选项名(如”--file“),以及跟着一个参数(有些选项不需要),至少需要包含一个短选项名或者长选项名。每个选项其实就是对某一个attribue设置一个value。那么dest='port'就是指明attribute的名称是dest, default=7890指value的默认值为7890,这个value也可以从调用命令的参数行中获取。type=‘int’指value的类型是整数,optparse支持多种类型,主要是string(字符串),int(整数),float(浮点),True, False。help=“..."指输出帮助信息说明该选项的用途。所以一个Option对象,会有以下几个属性值:

  • 短选项名称列表
  • 长选项名称列表
  • dest(attribute名称)
  • default(指定默认值)
  • type(value的类型)
  • help (帮助信息)
  • action (通常是store,还有store_const, store_true, store_false。)

下面是Option类的初始化方法:

560     def __init__(self, *opts, **attrs):

                 #opts接收选项名称参数列表,如['-f', '--file']

                 #attrs接收dest,default,type这些属性设置参数
 563         self._short_opts = []   #短选项名称列表
 564         self._long_opts = []    #长选项名称列表
 565         opts = self._check_opt_strings(opts)   #检查选项名称列表opts,至少应该有一个短选项名,或一个长选项名
 566         self._set_opt_strings(opts) #解析opts列表的每个成员是否合法,以'-'或'--'开头,

                                                                   #否则抛出OptionError异常。最后,将合法的成员分别

                                                                   #放入对应列表self._shor_opts或者self._long_opts。
 567 
 568         # Set all other attrs (action, type, etc.) from 'attrs' dict
 569         self._set_attrs(attrs)             #解析attrs字典(包含属性设置参数)
 576         for checker in self.CHECK_METHODS:  #检查每个属性设置是否合法
 577             checker(self)

self._set_attrs(attrs)的代码如下,Option类包含一个属性值列表 ATTRS = ['action',  'type',  'dest', 'default',  'nargs', 'const', 'choices',
  'callback',  'callback_args', 'callback_kwargs',  'help', 'metavar']。

 609     def _set_attrs(self, attrs):
 610         for attr in self.ATTRS:   #遍历这个列表的每个attr
 611             if attr in attrs:  #如果attr也存在于创建Option对象时声明的attrs字典中
 612                 setattr(self, attr, attrs[attr])  #从字典中取出,并设置为对象的一个属性。

                                                                        #例如dest='port',则会得到self.dest='port'
 613                 del attrs[attr]                         #从attrs字典中弹出
 614             else:
 615                 if attr == 'default':
 616                     setattr(self, attr, NO_DEFAULT)
 617                 else:
 618                     setattr(self, attr, None) #设置这个属性的值为None
 619         if attrs: #如果attrs字典不为空,表明含有非法的属性名称,抛出异常。
 620             attrs = attrs.keys()
 621             attrs.sort()
 622             raise OptionError(
 623                 "invalid keyword arguments: %s" % ", ".join(attrs),
 624                 self)

CHECK_METHODS是一个回调函数列表,每个回调函数以Option对象为参数,执行一项检查。每个检查是独立的,可以很方便地增加或者修改一个检查。

 736     CHECK_METHODS = [_check_action,
 737                                               _check_type,
 738                                              _check_choice,
 739                                               _check_dest,
 740                                             _check_const,
 741                                             _check_nargs,
 742                                            _check_callback]


629     def _check_action(self):
 630         if self.action is None:
 631             self.action = "store"
 632         elif self.action not in self.ACTIONS:
 633             raise OptionError("invalid action: %r" % self.action, self)

Option类的其他方法,都是些辅助的方法。比较重要的两个就是process和take_action,这是在解释命令行参数时会被OptionParser(容器对象)调用到的,目的的是检查对应的参数选项的值是否合法,以及对这个参数值应该怎么处理。例如,当一个选项声明自己是‘int’类型的参数,那么它的值就不能是‘string’。如果命令行输入‘-h'选项参数,则take_action会输出帮助信息,并退出。一般的情况下,则是存储参数值,然后执行下一步。

2. OptionParser类

OptionParesr继承于OptionContainer类。整个模块里,也就只有这两个容器类,所以可以简单地认为就是这两个类功能的合集。我们只主要查看我们使用到的两个方法add_option() 和parse_args()。

首先,OptionParser包含的几个主要的属性值:

_short_opt: {string: Optiong}字典对象。一个短选项名(如, "-f")对应一个Option对象。

_long_opt: {string: Option }。一个长选项名(如:"--file")对应一个Option对象。

defaults: {string: andy } 。 键为dest , 值为缺省值。

option_list: 列表。容器所包含的Option对象。

下面是add_option的代码内容:

1007     def add_option(self, *args, **kwargs):
1011         if type(args[0]) in types.StringTypes:
1012             option = self.option_class(*args, **kwargs)    
#创建一个Option类
1013         elif len(args) == 1 and not kwargs:    #传入的参数是一个Option对象的情况,较少用
1014             option = args[0]
1015             if not isinstance(option, Option):
1016                 raise TypeError, "not an Option instance: %r" % option
1017         else:
1018             raise TypeError, "invalid arguments"
1019 
1020         self._check_conflict(option)  #检查新增的参数选项是否和之前的有冲突。

                                                                      #方法:创建一个空的冲突选项列表。遍历option对象的所有短选项名,

                                                                      #如果存在于容器对象的_shor_opt字典里,则添加到冲突选项列表。

                                                                      #同样的方法,处理长选项名。

                                                                      #最后如果冲突选项列表不空,则表示有冲突,调用冲突处理方法conflict_handler。
1021 
1022         self.option_list.append(option)  #添加到列表中
1023         option.container = self
1024         for opt in option._short_opts:   #对短选项名处理,添加到_short_opt字典中
1025             self._short_opt[opt] = option
1026         for opt in option._long_opts:    #对长选项名处理。
1027             self._long_opt[opt] = option
1028 
1029         if option.dest is not None:     #选项对应的缺省值处理
1030             if option.default is not NO_DEFAULT:
1031                 self.defaults[option.dest] = option.default
1032             elif option.dest not in self.defaults:
1033                 self.defaults[option.dest] = None
1034 
1035         return option

下面是parse_args()的代码:

1367     def parse_args(self, args=None, values=None):
1381         rargs = self._get_args(args)  
#通常args为None,返回命令行参数列表。(不包含程序名)

                                                                       #调用sys.argv[1:]
1382         if values is None:   #values是一个Value对象,可以认为是一个属性值容器。

                                                    #每个选项最终都会对应一个键值对。例如, (’-p‘, dest='port', default=7890)。

                                                    #最终变成values.port=7890。这是缺省值。如果命令行参数输入 “-p 8890”,

                                                    #则变成values.port=8890。
1383             values = self.get_default_values()
1394         self.rargs = rargs  

1395         self.largs = largs = []
1396         self.values = values
1397 
1398         try:
1399             stop = self._process_args(largs, rargs, values)#解析命令行参数,主要是处理选项参数,

                                                                                                             #如果有选项设置改变了缺省值,最终改变values这个属性值容器的某个属性。

                                                                                                             #末尾的参数放在rargs里
1400         except (BadOptionError, OptionValueError), err:
1401             self.error(str(err))
1402 
1403         args = largs + rargs
1404         return self.check_values(values, args)  #这个方法未作任何处理,最终返回(values, args)

处理的流程很简单。接下来看_process_args()的代码,如下。主要看其如何处理长选项名参数,和短选项名参数。

1419     def _process_args(self, largs, rargs, values):
1429         while rargs:
#rargs是命令行参数列表,由命令行参数字符串用空格切割得到。

                                        #遍历每个参数,分别对其进行解析。
1430             arg = rargs[0]
1434             if arg == "--": 
1435                 del rargs[0]
1436                 return
1437             elif arg[0:2] == "--": #以‘--’开头,说明这是一个长选项名参数
1438                 # process a single long option (possibly with value(s))
1439                 self._process_long_opt(rargs, values)
1440             elif arg[:1] == "-" and len(arg) > 1:#以‘-’开头,说明这是一个短选项名参数
1441                 # process a cluster of short options (possibly with
1442                 # value(s) for the last one only)
1443                 self._process_short_opts(rargs, values)
1444             elif self.allow_interspersed_args:
1445                 largs.append(arg)
1446                 del rargs[0]
1447             else:
1448                 return                  # stop now, leave this arg in rargs

_process_long_opt()是处理长选项名的方法,代码如下:

1479     def _process_long_opt(self, rargs, values):
1480         arg = rargs.pop(0)
#从命令行参数列表rargs弹出
1484         if "=" in arg:   #对于“--file=outfile”的形式
1485             (opt, next_arg) = arg.split("=", 1) 
1486             rargs.insert(0, next_arg) #将‘outfile’又放入命令行参数中,后面的处理会用到这个。

                                                                   #等同于,变换成“--file outfile”
1487             had_explicit_value = True #表明这个参数选项,确定跟着一个参数值。
1488         else:  #对于“--file outfile”的形式
1489             opt = arg
1490             had_explicit_value = False
1491 
1492         opt = self._match_long_opt(opt) #检查这个选项名,是不是我们所定义过的
1493         option = self._long_opt[opt] #取得它所对应的Option对象
1494         if option.takes_value(): #这个选项名后应该跟着一个或者多个参数
1495             nargs = option.nargs #获得这个选项后应该跟着的参数个数,缺省值为1个
1496             if len(rargs) < nargs: #命令行参数列表的个数已经少于需要的个数,抛出异常
1497                 if nargs == 1:
1498                     self.error(_("%s option requires an argument") % opt)
1499                 else:
1500                     self.error(_("%s option requires %d arguments")
1501                                % (opt, nargs))
1502             elif nargs == 1:  #只需要一个参数,直接取出后面的一个参数放在value中
1503                 value = rargs.pop(0)
1504             else: #多于一个参数,从后面取出指定数量的参数放在列表value中
1505                 value = tuple(rargs[0:nargs])
1506                 del rargs[0:nargs]  
1507 
1508         elif had_explicit_value: #选项后不需要跟着参数,但实际确有参数,抛出异常。

                                                            #例如,('--quiet', action=’store_true',),‘quiet'选项不许要参数,

                                                            #但是命令行输入’--quiet=yes', 这样是错误的。
1509             self.error(_("%s option does not take a value") % opt)
1510 
1511         else:
1512             value = None
1513 
1514         option.process(opt, value, values, self) #将这个选项对应的参数值进行处理,并放在values中。

                                                                                          #对于‘-h’选项,则是输出帮助信息,然后退出程序。

_process_short_opts对于短参数名称的处理,跟_process_long_opts()类似。

总结一下,OptionParser处理命令行参数的过程。以我们创建的client.py为例,当输入python client.py -s 10.2.20.99 --quiet “it's nice"时,处理的流程如下:

a. 从sys.argv[:1]获取命令行参数(如:[" -s" , " 10.2.20.99", " --quiet", "It's nice."])

b.取出‘-s', 这是以’-s'开头,调用_process_short_opts(),查找容器对象的_short_opt字典,找到对应的Option对象。没找到则抛出异常。

c.调用option.takes_value()。得到这个Option对象后面应该跟着一个参数,从命令行参数列表取出“10.2.20.99”,放入value中。

d.调用option.process(opt, value, values, self)。将检查value是否合法,然后存在values中,即values.server_addr = "10.2.20.99"。

e.处理下一个"--quiet", 这是以‘--’开头的,调用_process_long_opts(), 查找容器对象的_long_opt字典,找到对应的Option对象。

f. 调用option.takes_value(), 发现这个Option对象后面不需要跟着参数。value=None。

g.调用option.process(opt, value, values, self)。根据这个Option对象的action=‘store_false',即将值设置为False。所以,values.verbose=False(因为dest=’verbose‘)。

h.取出“It’s nice”,这不是以‘-’或‘--’开头的,所以不是一个选项参数。命令行参数处理结束,将“It‘s nice”放在args中返回。

i.从opt,args=parser.parse_args()等到的是一个Value对象opt, args参数列表。在这里args=“it’s nice”, opt.server_addr="10.2.20.99", opt.verbose=False。


总结:

本文只是介绍了两个主要的类:Option和OptionParser,和两个主要的方法add_option()和parse_args()。其余的部分,主要似乎Error异常类的,和Formatter(帮助信息输出格式化)。看别人代码如何实现其主要的功能,这是个简单的过程。但是要想理解作者但是在创建的过程中的想法,这是比较难的。更难的是,把这种想法变成自己的,并加以利用和改进。这是向别人学习的过程,没那么容易。

收获: 1.一直对标准库代码有点恐惧。那得是多么高深的啊,我怎么可能看懂?其实,也没那么难,至少optparse是我能消化的。当然也有很复杂的。首先消除了恐惧的心里,从简单的入手,复杂的以后再解决。2.在看代码的过程中,可以学习很多东西,代码的编写风格,算法思路,很多。这会是一个潜移默化的过程。我会坚持一段时间,每周分析一个简单的标准库模块。下一个是logging模块。

 写这个文章花了我5个小时,但我还是觉得,别人不一定能看懂。也许我应该考虑更好的表述方式,流程图,类的描述图。这也是我欠缺的能力。                                                       

Python学习:optparse模块 optparse,是一个更够让程序设计人员轻松设计出简单明了、易于使用、符合标准的Unix命令例程式的Python模块,生成使用和帮助信息。 阅读详情

相关推荐

【学习体会】Lighttools8.4.0:软件基本使用+光度学基本概念+系统初始设置

关于Lighttools8.4.0软件的安装教程,详见我的另一篇博文:【软件安装】win10下Lighttools8.4.0(64)光学系统建模软件的安装教程 在本文中,我们将学习到,光度学的基本概念、系统初始设置、物体模型坐标的使用方法、简单光学系统实例、系统浏览器的作用和内容、设置虚拟相机并渲染视图中的图像、仿真结果3D显示等。 如果有其他感兴趣的内容但是我又没有写的,欢迎在评论区留言! 光度学的基本概念 软件的基本介绍 参考博文:https://www.docin.c...

LeonJin的博客 2万+

optparse模块学习

optparse模块学习 在python中有两类处理命令行的方式: 使用sys.argv(此种方式适用于使用命令行运行python代码时,解析命令行参数) 另一种方法是使用python代码处理(额外添加参数等,此种方法主要用到两个模块getopt、optparse) OptionParser类中底层使用的是sys.argv读取参数。OptionParser是对argv的高度封装,用来处理参数。在OptionParser中有如下代码:(可看出使用的是argv) optparse是一种类似于dos命令行的

qq_43477218的博客 1382

别再手动建模了!用Simscape Multibody Link一键导入SolidWorks装配体到Simulink

本文介绍了如何利用Simscape Multibody Link插件将SolidWorks装配体一键导入Simulink,实现CAD到仿真的无缝衔接。该技术显著提升机械系统设计与控制效率,特别适用于工业机器人、车辆悬架等复杂机构的动力学分析。文章详细解析了插件安装、模型导出优化及仿真验证的全流程,帮助工程师摆脱手动建模的低效工作模式。

weixin_27256197的博客 457

python3 的optparse库_python OptParse模块的用法详解

OptParse模块的简单介绍Python 有两个内建的模块用于处理命令行参数:一个是 getopt只能简单处理 命令行参数;另一个是 optparse,它功能强大,而且易于使用,可以方便地生成标准的、符合Unix/Posix 规范的命令行说明。会自动帮你负责-h帮助选项。要自己定制程序的参数选项控制,可以使用python自带的OptParse模块,当然也可以直接解析sys.argv里的参数(但是...

weixin_33803878的博客 2124

Bioinformatics2021 | FraGAT+:基于分子原始片段的多尺度图注意力机制的分子性质预测模型

Bioinformatics2021 | FraGAT:基于分子原始片段的多尺度图注意力机制的分子性质预测模型

justBeHerHero 1999

SQL Server数据库备份与恢复

在 SQL Server 中,数据库备份与恢复是保障数据安全的核心操作。

zjw541806的博客 1876

Python教程:optparse—命令行选项解析器,Python开发必须要会

如果你也是看准了Python,想自学Python,在这里为大家准备了丰厚的免费。

2401_83977580的博客 1039

YOLO26全新改进 | 最全损失函数改进篇 | SIoU 、WIoU、GIoU、DIoU、EIOU、CIoU, InnerIoU、InnerSIoU、InnerWIoU、FocusIoU等损失函数

🔥本文详细介绍了如何修改YOLO26中的损失函数。首先提供了完整的损失函数核心代码,包括WIoU_Scale类和各种IoU计算方法。然后分三步指导修改:1)替换metrics.py中的bbox_iou方法;2)修改loss.py中的iou计算代码;3)更新tal.py中的相关代码。文中特别强调了修改损失函数应在模型结构调整后使用,并提供了多种IoU损失函数的参数配置建议,包括SIoU、WIoU、GIoU等,可根据实际需求灵活选择搭配使用。

Ai缝合怪、助力小伙伴高效发论文 449

深入理解python 命令行解析模块optparse(optparse源代码解读)

optparse是python用来解析命令行参数的,最早是getopt,option比getopt更强大和灵活。最新的命令行解析使用argparse,因此optparse今后将不会再被开发,optparse在python的源代码位置是Lib/optparse.py。optparse.py模块主要类结构简介optparse里面包含了几个主要的类:OptionParser解析类、Option定义类、Va

hawkerou的博客 7591

【船舶】风浪流模型水面船舶三自由度运动仿真【含Matlab源码 4379期】

风浪流模型水面船舶三自由度运动仿真 完整的代码,包运行;运行操作视频见优快云资源!适合小白!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 693

OmniBox2.0.X版本 一站式影视订阅与多端播放平台文档

OmniBox 是一站式影视订阅与多端播放平台:你可以用 JS 或 Python 按 OmniBox 规范自建爬虫源,在后台把多个爬虫源自由组合成订阅,然后在网页、手机、电视等全平台的客户端里使用。只要客户端支持 TVBox、猫源、UZ、Emby 等协议,即可无缝对接。同时支持电视直播源、六大平台直播间和网盘源视频在线观看,通过 Docker 一键部署。

欢迎来到鸾姝淡月博客,专为程序员和编程爱好者打造的技术博客。我们分享编程语言趋势、开发工具、编程哲学、职业发展等,助你掌握新技术,优化技能,激发编程热情。 1903

Python模块学习——optparse

Python 有两个内建的模块用于处理命令行参数: 一个是 getopt,《Deep in python》一书中也有提到,只能简单处理 命令行参数; 另一个是 optparse,它功能强大,而且易于使用,可以方便地生成标准的、符合Unix/Posix 规范的命令行说明。 示例 下面是一个使用 optparse 的简单示例: Python代码 ...

978

【RV1126/RV1109学习笔记】#基础篇#(2)基础入门使用

一、调试方式 1、串口调试 2、ADB调试 3、网络调试 二、基础外设使用 音频使用(aplay,arecord,amixer) 三、WIFI连接 四、屏幕背光控制

丨晋丨 1855

Python学习笔记之optparse模块OptionParser

一、基本用法          optparse,是一个更够让程序设计人员轻松设计出简单明了、易于使用、符合标准的Unix命令例程式的Python模块。生成使用和帮助信息       首先你必须导入该类,并创建一个OptionParser对象,然后再使用parser.add_option(...)待定义命令行参数,及其帮助文档。        每个命令行参数就是由参数名字符串和参数属性组成的。如 ...

愚公求道 4万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

optparse模块

<!-- @page {margin:0.79in} p {margin-bottom:0.08in} -->        该模块提供了解析命令行选项的接口,其中optparse已经在2.7以后的版本中已经不再继续开发好此模块,从2.7后,将开发argparse模块。 optparse模块使用的代码示例: #!/bin/sh # # This is a lear

山庄来客的专栏 4900

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Python optparse模块

optparse模块主要用来为脚本传递命令参数,采用预先定义好的选项来解析命令行参数。 optparse,它功能强大,而且易于使用,可以方便地生成标准的、符合Unix/Posix 规范的命令行说明。这很类似Linux中一些命令的参数,比如ls -a。optparse模块实现的也是类似的功能,它是为脚本传递命令参数。 首先需要引入optparser模块,然后执行初始化,实例化一个OptionPar...

一起学习 660

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Python3入门之——optparse模块

Python 有两个内建的模块用于处理命令行参数:一个是 getopt,《Deep in python》一书中也有提到,只能简单处理 命令行参数;另一个是 optparse,它功能强大,而且易于使用,可以方便地生成标准的、符合Unix/Posix 规范的命令行说明。 示例 下面是一个使用 optparse 的简单示例: from optparse import OptionParser [...] parser = OptionParser() parser.add_option("-f", "

肥叔菌的博客 5262

python3 的optparse库_python optparse模块使用实例

这篇文章主要介绍了python optparse模块使用实例,optparse是专门来处理命令行选项的,本文就讲解了它的使用方法,需要的朋友可以参考下使用命令行时,如果要添加选项的话,python 2.3里新增加了一个模块叫optparse,也是专门来处理命令行选项的。from optparse import OptionParserparser = OptionParser()parser.ad...

weixin_39906906的博客 244

optparse 模块

optparse模块主要用来为脚本传递命令参数,采用预先定义好的选项来解析命令行参数。 首先需引入optparser模块 => 然后执行初始化=>实例化一个OptionParser对象(可以带参,也可以不带参数)=>再为命令行添加选项 官方文档 1 """A powerful, extensible, and easy-to-use option p...

weixin_30378311的博客 232

python脚本 optparse模块的使用

python脚本 optparse模块的使用 # 1,导包 from optparse import OptionParser # 2,创建实例 parser = OptionParser() # 3,添加参数选项 parser.add_option("-f", "--file", dest='fileName', action='store', type=str, metavar='file',...

weixin_43514279的博客 254

python之optparse模块

optparse模块

gRpc的博客 667

python3 的optparse库_python的optparse模块

optparse主要用来为脚本传递命令参数,采用预先定义好的选项来解析命令行参数实例化一个OptionParser()对象(可以传参也可以不传参),带参的话会把参数变量的内容作为帮助信息输出。即可以用来自己定制程序的参数选项控制。1、举例:py15.py脚本:#coding=utf-8"""Python 有两个内建的模块用于处理命令行参数:一个是 getopt,只能简单处理 命令行参数;另一个是 ...

weixin_39913648的博客 453
上一篇: 使用wsgi模块将Django加于apache
下一篇: Unittest使用和代码简介
wangst4321
博客等级 码龄16年 4粉丝 25原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值