python函数 https://www.e-learn.cn/tag/pythonhanshu zh-hans Python基础——函数入门 https://www.e-learn.cn/topic/3987276 <span>Python基础——函数入门</span> <span><span lang="" about="/user/201" typeof="schema:Person" property="schema:name" datatype="">不羁的心</span></span> <span>2021-01-02 23:38:13</span> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"> <p>一、函数的定义</p> <p>1、函数的格式  def  函数名(参数):                  例如: def a(x,y):</p> <p>函数代码块以 def关键字开头,+函数名(参数)冒号。回车后,第一行内容应该缩进,然后写逻辑代码。</p> <p>2、return关键字     代表函数执行完返回的值</p> <p>     pass关键字        代表什么都不做</p> <p>     exit()            强行退出</p> <p>3、函数的参数</p> <p>     参数  *args           代表tuple类型(即:一个*代表是tuple类型)</p> <p>     参数  **kwargs     代表dict 字典类型(即:两个**代表是dic类型)</p> <p>4、简单举例:(加法计算)</p> <p>     <img height="491" width="1034" class="b-lazy" data-src="https://static.oschina.net/uploads/space/2018/0412/152816_rnXN_3821557.png" data-original="https://static.oschina.net/uploads/space/2018/0412/152816_rnXN_3821557.png" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /></p> <p>     结果:<img height="125" width="638" class="b-lazy" data-src="https://static.oschina.net/uploads/space/2018/0412/152853_ygbG_3821557.png" data-original="https://static.oschina.net/uploads/space/2018/0412/152853_ygbG_3821557.png" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /></p> <p>5、匿名函数lambda</p> <p>     匿名函数就是没有名字的函数,为什么设置匿名函数呢?</p> <p>     lambda 函数是一种快速定义单行的最小函数,可以用在任何需要函数的地方。</p> <p>     例如: def fun(x,y)            等同于          r = lambda x,y:x*y</p> <p>                return x*y</p> <p>二、高阶函数</p> <p>1、map(fun,list)  </p> <p>     接收一个函数fun 和一个list,并通过函数 fun 依次作用在list的每个元素上,得到一个新的list并返回。</p> <p>     map() 函数不改变原有的list,而是返回一个新的list。</p> <p>     因为list可以包含任意类型的元素,因此map函数可以包含任意类型的list,只要fun函数可以处理即可。</p> <p>     Python2   例如:<img height="90" width="431" class="b-lazy" data-src="https://static.oschina.net/uploads/space/2018/0412/170112_xI0l_3821557.png" data-original="https://static.oschina.net/uploads/space/2018/0412/170112_xI0l_3821557.png" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /></p> <p>     Python2   结果:<img height="23" width="430" class="b-lazy" data-src="https://static.oschina.net/uploads/space/2018/0412/170138_60q5_3821557.png" data-original="https://static.oschina.net/uploads/space/2018/0412/170138_60q5_3821557.png" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /></p> <p>     Python3   例如:</p> <p>                              <img height="217" width="511" class="b-lazy" data-src="https://static.oschina.net/uploads/space/2018/0412/165724_iKyq_3821557.png" data-original="https://static.oschina.net/uploads/space/2018/0412/165724_iKyq_3821557.png" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /></p> <p>     Python3  结果:<img height="54" width="427" class="b-lazy" data-src="https://static.oschina.net/uploads/space/2018/0412/165742_05LX_3821557.png" data-original="https://static.oschina.net/uploads/space/2018/0412/165742_05LX_3821557.png" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /></p> <p><strong><span style="background-color:#FF0000">注意:Python2 与 Python3 在运行map函数时有区别  。                                                                   </span></strong></p> <p><strong><span style="background-color:#FF0000">               Python2 不需要 list() 转换。Python3 需要list() 转化。                                                      </span></strong></p> <p><strong><span style="background-color:#FF0000">Python3中不进行list转换运行结果为:</span></strong><img height="26" width="449" class="b-lazy" data-src="https://static.oschina.net/uploads/space/2018/0412/170232_mBrM_3821557.png" data-original="https://static.oschina.net/uploads/space/2018/0412/170232_mBrM_3821557.png" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><strong><span style="background-color:#FF0000">   </span></strong></p> <p>2、reduce(fun,list)</p> <p>     接收一个函数fun 和一个 list。但是函数 fun 必须是两个参数,reduce() 对list的每个元素反复调用函数fun,并返回最终结果。</p> <p>    <span style="background-color:#FF0000"> <strong>注意:reduce 函数 存在于Python2的全局变量中。   在Python3中,它被放置于fucntools 模块中。 </strong></span></p> <p>3、sorted 函数     </p> <p> </p> <p> </p> <div class="alert alert-success" role="alert"><p>来源:<code>oschina</code></p><p>链接:<code>https://my.oschina.net/u/3821557/blog/1794693</code></p></div></div> <div class="field field--name-field-tags field--type-entity-reference field--label-above"> <div class="field--label">标签</div> <div class="field--items"> <div class="field--item"><a href="/tag/pythonhanshu" hreflang="zh-hans">python函数</a></div> <div class="field--item"><a href="/tag/gaojiehanshu" hreflang="zh-hans">高阶函数</a></div> </div> </div> Sat, 02 Jan 2021 15:38:13 +0000 不羁的心 3987276 at https://www.e-learn.cn python面向对象中类对象、实例对象、类变量、实例变量、类方法、实例方法、静态方法 https://www.e-learn.cn/topic/3556625 <span>python面向对象中类对象、实例对象、类变量、实例变量、类方法、实例方法、静态方法</span> <span><span lang="" about="/user/196" typeof="schema:Person" property="schema:name" datatype="">好久不见.</span></span> <span>2020-04-08 12:26:48</span> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"> <h1> 1. 类对象和实例对象</h1> <p><code>  Python</code>中一切皆对象,Python类本身也是一种对象,类定义完成后,会在当前作用域中定义一个以类名为名字的命名空间。类对象具有以下两种操作:</p> <ul><li>可以通过“类名()”的方式实例化一个对象。</li> <li> 可以通过“类名.类属性”的方式来访问一个类属性。</li> </ul><p>  如果说类时一种概念性的定义,是一种类别,那么实例对象就是对这一类别的具体化、实例化,即实例化对象是类对象实例化之后的产物。</p> <pre>class Person:# 声明一个类对象 pass p1 = Person()#声明一个实例对象 print(Person)#输出结果:&lt;class '__main__.Person'&gt; print(p1)#&lt;__main__.Person object at 0x0000015F7F94D0F0&gt;</pre> <h1>2 类变量与实例变量</h1> <h2><strong>2.1 概念上的区别</strong></h2> <p>  类变量是指是指该类的所有实例说共有的数据,实例变量是该类每一个实例所特有的数据。这么说的话可能还是很抽象,我们拿人类(Person类)来打比方,人类能移动(move=True),这是每一个人(张三、李四)都能做的,所以我们可以说人类能移动,张三能移动,李四也能移动,这里的移动(move)就是一个类变量。但每一个人都可能有不同的姓名(name)和年龄(age),张三可能20岁,李四可能30岁,但是我们不能说人类(Person)都是20岁或30岁,这里的姓名(name)和年龄(age)就是实例变量。</p> <pre>class Person: move = True # 这是类变量 def __init__(self , name , age): self.name = name # 这是实例变量 self.age = age # 这是实例变量</pre> <h2><strong style="font-size: 1.17em;">2.2 声明上的区别</strong></h2> <p>  类变量声明通常在类内部,但函数体外,不需要用任何关键字修饰。实例变量一般声明在<strong>实例方法内部</strong>(其他方法内部也不行),且用self关键字修饰。</p> <pre>class Person: move = True # 这是类变量, def __init__(self , name): self.name = name # 这是实例变量,必须声明在实例函数内,用self关键字修饰 # move = True # 类变量不能再函数体内声明,在这个位置声明的又没有self关键字修饰,只能是一个局部变量 # self.age = age # 这是错误的,实例变量不能再这里声明    eat = True # 这是类变量,可以在函数体外,类内部任意位置</pre> <p>  上面的变量绑定都是在对象声明过程中绑定的,但事实上类变量和实例变量都可以在类或者实例都可以在对象声明结束之后再绑定。“类名.变量名”绑定的是类变量,“实例名.变量名”绑定的是实例变量。</p> <pre>class Person: move = True def __init__(self , name , age): self.name = name self.age = age p1 = Person('张三' , 20) p1.gender='男' # 声明实例对象结束之后再绑定一个实例变量 Person.eat = True # 声明类对象结束之后再绑定一个类变量 print(p1.gender) # 输出结果:男 print(p1.eat) #输出结果:True</pre> <p>  注:虽然可以在对象声明之后再绑定对象,但是这种方式最好不要使用。</p> <h2><strong>2.3 访问上的区别</strong></h2> <p>  类变量可以通过“类名.变量名”和“实例名.变量名”的方式访问。实例变量只能通过“实例名.变量名”的方式来访问。</p> <pre>class Person: move = True # 这是类变量 def __init__(self , name , age): self.name = name # 这是实例变量 self.age = age # 这是实例变量 p1 = Person('张三' , 20) print(p1.name , p1.age) # 通过“实例名.变量名”的方式访问实例变量 print(p1.move) # 通过“实例名.变量名”的方式访问实例变量 print(Person.move) # 通过“类名.变量名”方式访问类变量 # print(Person.name) # 这是错误的</pre> <p>  注:虽然可以通过“实例名.类变量名”的方式访问类变量,但是并不推荐,最好还是通过“类名.类变量名”来访问类变量。</p> <h2><strong>2.4 存储上的区别</strong></h2> <p>  类变量只会在用class关键字声明一个类时创建,且也只会保存在类的命名空间中,这个类的实例的命名空间中是没有的。通过“实例名.类变量名”访问类变量时,实际访问的是类命名空间中数据,所以所有实例访问到的数据都是同一个变量。实例变量保存在实例各自的命名空间中。</p> <pre>class Person: move = True # 这是类变量 def __init__(self , name , age): self.name = name # 这是实例变量 self.age = age # 这是实例变量 p1 = Person('张三' , 20) p2 = Person('李四' , 30) # 通过id()函数查询move内存地址 print(id(p1.move)) # 输出结果为:1622667424 print(id(p1.move)) # 输出结果为:1622667424</pre> <h1>3 静态方法、类方法、实例方法</h1> <h2>3.1 静态方法</h2> <p>  静态方法是指在定义时,使用@staticmethod装饰器来修饰,无序传入self或cls关键字即可进行创建的方法。在调用过程时,无需将类实例化,直接通过“类名.方法名()”方式调用方法。当然,也可以在实例化后通过“实例名.方法名()”的方式调用。在静态方法内部,只能通过“类名.类变量名”的方式访问类变量。</p> <pre>class Person: move = True def __init__(self , name , age): self.name = name self.age = age @staticmethod def static_fun(): # 声明一个静态方法 print(Person.move) p1 = Person('张三' , 20) p1.static_fun() #输出结果:这是静态方法 Person.static_fun() #输出结果:这是静态方法</pre> <h2>3.2 类方法</h2> <p>  类方法需要使用@classmethod装饰器来修饰,且传入的第一个参数为cls,指代的是类本身。类方法在调用方式上与静态方法相似,即可以通过“类名.方法名()”和“实例名.方法名()”两种方式调用。但类方法与静态方法不同的是,类方法可以在方法内部通过cls关键字访问类变量。在类方法内部,既能通过“类名.类变量名”的方式访问类变量,也能通过“cls.类变量名”的方式访问类变量。</p> <pre>class Person: move = True def __init__(self , name , age): self.name = name self.age = age @classmethod def class_fun(cls): # 声明一个类方法 print(cls.move) print(Person.move)# cls 指的就是Person类,等效 p1 = Person('张三' , 20) p1.class_fun() #输出结果:True True Person.class_fun() #输出结果:True True</pre> <h2>3.3 实例方法</h2> <p>  在一个类中,除了静态方法和类方法之外,就是实例方法了,实例方法不需要装饰器修饰,不过在声明时传入的第一个参数必须为self,self指代的就是实例本身。实例方法能访问实例变量,静态方法和类方法则不能。在实例方法内部只能通过“类名.类变量名”的方式访问类变量。在调用时,实例方法可以通过“实例名.实例方法名”来调用,如果要通过类来调用,必须必须显式地将实例当做参数传入。</p> <pre>class Person: move = True def __init__(self , name , age): self.name = name self.age = age def instance_fun(self): # 声明一个实例方法 print(Person.move) # 访问类变量 print(self.name , self.age) p1 = Person('张三' , 20) p1.instance_fun() Person.instance_fun(p1) #通过类访问实例方法时,必须显式地将实例当做参数传入</pre> <p> </p> <div class="alert alert-success" role="alert"><p>来源:<code>https://www.cnblogs.com/chenhuabin/p/10055316.html</code></p></div></div> <div class="field field--name-field-tags field--type-entity-reference field--label-above"> <div class="field--label">标签</div> <div class="field--items"> <div class="field--item"><a href="/tag/leiduixiang" hreflang="zh-hans">类对象</a></div> <div class="field--item"><a href="/tag/shilibianliang" hreflang="zh-hans">实例变量</a></div> <div class="field--item"><a href="/tag/jingtaifangfa" hreflang="zh-hans">静态方法</a></div> <div class="field--item"><a href="/tag/mianxiangduixiangfangfa" hreflang="zh-hans">面向对象方法</a></div> <div class="field--item"><a href="/tag/pythonhanshu" hreflang="zh-hans">python函数</a></div> <div class="field--item"><a href="/tag/pythonshili" hreflang="zh-hans">python实例</a></div> <div class="field--item"><a href="/tag/jingtaihanshu" hreflang="zh-hans">静态函数</a></div> <div class="field--item"><a href="/tag/python" hreflang="zh-hans">python</a></div> <div class="field--item"><a href="/tag/bianliang" hreflang="zh-hans">变量</a></div> </div> </div> Wed, 08 Apr 2020 04:26:48 +0000 好久不见. 3556625 at https://www.e-learn.cn python基础知识之函数与函数式编程 https://www.e-learn.cn/topic/3556620 <span>python基础知识之函数与函数式编程</span> <span><span lang="" about="/user/187" typeof="schema:Person" property="schema:name" datatype="">允我心安</span></span> <span>2020-04-08 12:25:21</span> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"> <h1>3种编程方式:</h1> <p>  1.面向对象(最火的)。(过去大部分的编程方式);》》主要是依靠:类》》class ,就是具有逻辑的过程,说话的方式描述</p> <p>  2.面向过程。主要是 过程》》def 过程是没有返回值的函数,但是python也会返回none 基本与函数式编程没有区别了,最小的单元是一个一个的def定义的过程,一个一个逻辑是def定义的过程</p> <p>  3.函数式编程。编的函数更接近数学中的函数 是一种编程规范 也就是如何编程的方法论 主要是 函数》》def 例如lisp #hashshell erlang# 三种语言 可以 真正较纯粹的使用函数式编程来编写程序。</p> <p>示例:(1+2)*3-4</p> <p>传统编程方法:var a =1+2;</p> <p>          var b =1*3;</p> <p>       var c =b-4;</p> <p>函数式编程则要求使用函数进行,把不同的运算定义成不同函数进行计算,写成下面的形式来进行:</p> <p>var result = subtract(multiplely(add(1,2),3),4);</p> <p> </p> <h3>python中的函数式编程是:逻辑结构化和过程化的一种编程方法</h3> <h3>一,函数基础介绍(day3 22)【funt_test.PY】</h3> <p>def func1():#函数<br />    '''文档介绍'''<br />    print('in the func1')#过程<br />    return 0#返回值</p> <p>def func2():#过程<br />     '''文档介绍'''<br />     print('in the func2')#函数体</p> <p>x=func1()<br />y=func2()<br />print(x)<br />print(y)</p> <p>重用函数的优点,可以让老代码,快速得到再次利用。</p> <p>重要函数的优点,可以扩展方便,修改功能更方便,保持一致性。</p> <p>return %s %s》》终止函数继续运行,并返回结果一定是一个值,但若写多个值则,多个值则是打包成一个元组返回 (% %) </p> <p>函数返回值的作用是:告诉使用者,这个函数调用后的结果是什么,让后来的人知道函数的运行结果,能够根据这个结果做出相应的反应。</p> <p>def test(x,y,z):</p> <p>  pass</p> <p>#中x和y为函数中的形参(也叫位置参数),这个x和y不是真实存在的,只是一个引导量中间量,不占用内存空间的,相当于一个内存空间的标识,即房子的门牌号。</p> <p>而调用这个函数时text(1,2)中这个1和2则是实参要占相应的内存的,要占x和y所代表的两个内存。相当于向x和y这个门牌号写的房子里丢1和2这两个东西。</p> <p>函数有关键字调用赋值,的位置参数调用赋值</p> <p>即test(y=1,x=2,z=3)和test(x,y)#位置调用必须按照顺序写,关键字可以不按顺序写。</p> <p>  #注意#在调用时关键参数调用是不能写在位置参数前面的。例如可以写text(1,z=6,y=8)但是不能写成text(1,y=8,8)</p> <p> def text(x,y=2):</p> <p>  pass</p> <p>#这个y便是默认参数,在调用时有没有赋值y都是可以的默认参数可以不赋值#注意#但没有赋值默认参数时则按照默认的值运行,但是形参即位置参数必须有赋值。</p> <p>##附加##但写pass时这个后面的过程可直接忽略,不报错#方便下次继续扩展。</p> <p>def text(*args):</p> <p>  pass</p> <p>#当这么定义函数的形参后,则赋值时可以传很多的值进去如text(5,1,4,6,5,46,6,5)也可text(*[1,5,156,648,3]),它会将其打包成一个元组再赋值给形参args。</p> <p>##即将n个参数转换成元组的方式传进去##</p> <p>def text(**kwargs):</p> <p>  print(kwargs)</p> <p>##**kwargs的作用是,把n个关键字参数变成字典传进去## 如text(**{'N'=1,'M'='SOO'}) 或者text(name=‘i’,age=8)</p> <p>*args和**args也可以混合使用</p> <h3>二,函数,局部/全局变量(day3 23)</h3> <p>小贴士:选中 再CTRL+/  则 批量注释</p> <p>局部变量只在函数里生效,例如:</p> <p>在语法块(定义的函数里)里定义的就是局部变量</p> <pre>school=1#这个就是全局变量,在没有缩进的地方定义的是全局变量#而且全局变量是不能被语法块里定义的局部变量改变的,但是这样仅仅是指数字和字符串,其他数据类型是可以修改的。def change_name(name): global school#但是如果加上global则可以在函数里改全局变量,注意一般不要这样使用,因为这样改了之后不好调试。 school = "Mage Linux" print("before change",name,school) name ="Alex li" #这个函数就是这个变量的作用域 age =23 print("after change",name) print("school:",school) name = "alex" change_name(name) print(name) 》》Traceback (most recent call last): File "C:/Users/home9/PycharmProjects/task1/day3/局部变量.py", line 27, in &lt;module&gt; print("school:",school) NameError: name 'school' is not defined'''全局变量和局部变量,在子程序中定义的变量称为局部变量,在程序的一开始定义的称为全局变量。全局变量的作用域是整个程序,而局部变量的作用域是定义该变量的子程序特别注意:当全局变量与局部变量重名时,在定义局部变量的子程序内,局部变量起作用;在其他地方全局变量起作用。'''</pre> <h3> 三,函数,递归(day3,25)</h3> <p>递归特性:</p> <p>1.必须有一个明确的结束条件。</p> <p>2.每次进入更深一层递归时,问题的规模相对比上一次递归都有所减少,减的越多则算法的效率越高。</p> <p>3.递归效率不高,递归层数过多会导致栈溢出(在计算机中函数的调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回栈就会减少一层栈帧。由于栈的大小不是无限的,所以递归调用的次数过多,会导致栈溢出)(python里最多是999次)</p> <p>小贴士:程序调试,用pycharm的断点功能,一步一步的看执行过程。(—------》》14:15)</p> <h3>四,高阶函数(day3,26)</h3> <p>变了能指向函数,函数的参数能接受变量,那么一个函数就可以接受另一个函数作为参数,这种函数就称之为高阶函数。</p> <p>def add(a,b):      </p> <p>  return a+b          </p> <p>简单的函数》》》》高阶函数》》》》def (a,b,c):</p> <p>def add(a,b,f)<em>:</em></p> <p>  return f(a)+f(b)#函数调用一个其他函数进去</p> <p>res = abs(3,-6,abs)#也可用传函数名进去执行这个函数。</p> <p>print(res)</p> <p> </p> <p>   </p> <p> </p> <div class="alert alert-success" role="alert"><p>来源:<code>https://www.cnblogs.com/home979/p/7853854.html</code></p></div></div> <div class="field field--name-field-tags field--type-entity-reference field--label-above"> <div class="field--label">标签</div> <div class="field--items"> <div class="field--item"><a href="/tag/jububianliang" hreflang="zh-hans">局部变量</a></div> <div class="field--item"><a href="/tag/pythonhanshu" hreflang="zh-hans">python函数</a></div> <div class="field--item"><a href="/tag/pythonquanjubianliang" hreflang="zh-hans">python全局变量</a></div> <div class="field--item"><a href="/tag/digui" hreflang="zh-hans">递归</a></div> <div class="field--item"><a href="/tag/fuzhi" hreflang="zh-hans">赋值</a></div> <div class="field--item"><a href="/tag/python" hreflang="zh-hans">python</a></div> <div class="field--item"><a href="/tag/bianliang" hreflang="zh-hans">变量</a></div> </div> </div> Wed, 08 Apr 2020 04:25:21 +0000 允我心安 3556620 at https://www.e-learn.cn 《Python从菜鸟到高手》已经出版,开始连载了,购买送视频课程 https://www.e-learn.cn/topic/3556604 <span>《Python从菜鸟到高手》已经出版,开始连载了,购买送视频课程</span> <span><span lang="" about="/user/7" typeof="schema:Person" property="schema:name" datatype="">▼魔方 西西</span></span> <span>2020-04-08 12:12:39</span> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"><p><a href="http://product.dangdang.com/25333314.html" rel="nofollow"><p></p><img class="b-lazy" data-src="https://www.eimg.top/images/2020/04/08/80ba81cb03e26f2fb3c1d6e7066c3892.png" data-original="https://www.eimg.top/images/2020/04/08/80ba81cb03e26f2fb3c1d6e7066c3892.png" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><p></p></a></p> <p>好消息,《Python从菜鸟到高手》已经出版!!!</p> <p>  JetBrains官方推荐图书!JetBrains官大中华区市场部经理赵磊作序!送2400分钟同步视频课程!500个案例,400道Python练习题,电子书,10万行源代码,6个实战项目!</p> <p><a href="https://files.cnblogs.com/files/nokiaguy/%E5%AE%8C%E6%95%B4%E7%9B%AE%E5%BD%95.pdf" rel="nofollow">本书完整目录</a></p> <p>购买地址:</p> <p><a href="http://product.dangdang.com/25333314.html" rel="nofollow">当当</a></p> <p><a href="https://item.jd.com/12417265.html" rel="nofollow">京东</a></p> <p><a href="http://edu.51cto.com/sd/f3cfe" rel="nofollow">随书赠送的视频课程1</a><br /><a href="http://edu.51cto.com/sd/6bd44" rel="nofollow">随书赠送的视频课程2</a></p> <p><a href="http://edu.51cto.com/sd/e7b69" rel="nofollow">李宁老师的视频课程</a></p> <p>购买《Python从菜鸟到高手》一书,5分好评,评语不得低于20字,将截图发到2720687566@qq.com,赠送Python同步视频课程1年观看期限。</p> <p><a href="https://blog.51cto.com/androidguy/2173055" rel="nofollow">Python为何能上位碾压Java?</a></p> <p>《Python从菜鸟到高手》转载文章</p> <p><a href="https://blog.51cto.com/androidguy/2163107" rel="nofollow">Python从菜鸟到高手(1):初识Python</a><br /><a href="https://blog.51cto.com/androidguy/2169235" rel="nofollow">Python从菜鸟到高手(2):清空Python控制台</a><br /><a href="https://blog.51cto.com/androidguy/2169236" rel="nofollow">Python从菜鸟到高手(3):声明变量</a><br /><a href="https://blog.51cto.com/androidguy/2169238" rel="nofollow">Python从菜鸟到高手(4):导入Python模块</a><br /><a href="https://blog.51cto.com/androidguy/2169907" rel="nofollow">Python从菜鸟到高手(5):数字</a><br /><a href="https://blog.51cto.com/androidguy/2170403" rel="nofollow">Python从菜鸟到高手(6):获取用户输入、函数与注释</a><br /><a href="https://blog.51cto.com/androidguy/2170406" rel="nofollow">Python从菜鸟到高手(7):字符串</a><br /><a href="https://blog.51cto.com/androidguy/2170943" rel="nofollow">Python从菜鸟到高手(8):print函数、赋值与代码块</a><br /><a href="https://blog.51cto.com/androidguy/2171407" rel="nofollow">Python从菜鸟到高手(9):条件和条件语句</a><br /><a href="https://blog.51cto.com/androidguy/2171898" rel="nofollow">Python从菜鸟到高手(10):循环</a><br /><a href="https://blog.51cto.com/androidguy/2172728" rel="nofollow">Python从菜鸟到高手(11):列表的基础操作</a><br /><a href="https://blog.51cto.com/androidguy/2172751" rel="nofollow">Python从菜鸟到高手(12):通过索引操作序列元素</a><br /><a href="https://blog.51cto.com/androidguy/2173587" rel="nofollow">Python从菜鸟到高手(13):分片(Slicing)</a><br /><a href="https://blog.51cto.com/androidguy/2174523" rel="nofollow">Python从菜鸟到高手(14):序列的加法和乘法</a></p> <p>《Python从菜鸟到高手》知识结构图。</p> <p><a href="http://product.dangdang.com/25333314.html" rel="nofollow"><p></p><img class="b-lazy" data-src="https://www.eimg.top/images/2020/04/08/30abd4f403de39615038b75bd70c49fd.jpg" data-original="https://www.eimg.top/images/2020/04/08/30abd4f403de39615038b75bd70c49fd.jpg" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><p></p></a></p> <p>扫描二维码关注“极客起源”公众号,技术文章、视频课程应有尽有</p> <p><a href="https://geekori.com" rel="nofollow"><p></p><img class="b-lazy" data-src="https://www.eimg.top/images/2020/04/08/db7113cfccbb10fd71d9162614821f75.jpg" data-original="https://www.eimg.top/images/2020/04/08/db7113cfccbb10fd71d9162614821f75.jpg" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><p></p></a></p> <p>欢迎关注“Python战地笔记”公众号</p> <p><a href="https://geekori.com" rel="nofollow"><p></p><img class="b-lazy" data-src="https://www.eimg.top/images/2020/04/08/09c1c52c72dc8c24a44bfba63e90c6fa.jpg" data-original="https://www.eimg.top/images/2020/04/08/09c1c52c72dc8c24a44bfba63e90c6fa.jpg" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><p></p></a></p><div class="alert alert-success" role="alert"><p>来源:<code>51CTO</code></p><p>作者:<code>androidguy</code></p><p>链接:<code>https://blog.51cto.com/androidguy/2165688</code></p></div></div> <div class="field field--name-field-tags field--type-entity-reference field--label-above"> <div class="field--label">标签</div> <div class="field--items"> <div class="field--item"><a href="/tag/python" hreflang="zh-hans">python</a></div> <div class="field--item"><a href="/tag/pythonhanshu" hreflang="zh-hans">python函数</a></div> <div class="field--item"><a href="/tag/bianchengyuyan" hreflang="zh-hans">编程语言</a></div> <div class="field--item"><a href="/tag/kejixinwen" hreflang="zh-hans">科技新闻</a></div> </div> </div> Wed, 08 Apr 2020 04:12:39 +0000 ▼魔方 西西 3556604 at https://www.e-learn.cn Python基础 https://www.e-learn.cn/topic/3556532 <span>Python基础</span> <span><span lang="" about="/user/163" typeof="schema:Person" property="schema:name" datatype="">荒凉一梦</span></span> <span>2020-04-08 11:48:10</span> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"> <p><strong>1.输出</strong></p> <pre>print('hello world')</pre> <p> </p> <p><strong>2.定义变量</strong></p> <p><strong>  </strong></p> <pre>variable=5 variable2='hello'</pre> <p> </p> <p><strong>3.用户输入</strong></p> <p><strong>  </strong>user_input=input('提示内容')</p> <p><strong>4.逻辑运算符</strong></p> <p>  and  #两个都为true则为true</p> <p>  or   #一个条件为true则为true</p> <p>  not  #取反</p> <p><strong>5.赋值运算符</strong>  </p> <pre></pre> <pre>num=5   num+=1 #num=num+1   num-=1 #num=num-1   num*=1 #num=num*1   num/=1 #num=num/1   num//=1 #整除num=num//1   num**=1 #num=num**1   num%=1 #num=num%1</pre> <pre>6.while循环 注意:在Python中while不是用{}表示代码的结束 是用间距来表示 一般是tab一下</pre> <pre>语法:  while 条件:    ......  else:    #在Python中for循环 while循环结尾可以加else,表示循环结束后执行</pre> <pre>#例子:输出0-100之间所有偶数相加   num=1   size=0   while num&lt;=100:  #条件成立执行     if num%2==0:       size+=num     num+=1      print(size) else:     print('循环结束')</pre> <pre></pre> <p> </p> <pre> </pre> <p><strong>7.for 循环 </strong></p> <p><strong>  语法:</strong></p> <p><strong>    for i in 条件:</strong></p> <p>        .....</p> <pre>#例子:  for i in range(0,101,2): # range函数 参数1:从什么开始;参数2:截止;参数3:步长 一次增长多少 print(i)</pre> <p> </p> <p><strong>8.if  if elif 选择结构</strong></p> <pre>age=int(input("输入年龄")) #逻辑运算符 not and or print(5&gt;6 and 4&gt;9) #两个都为true则为true print(5&gt;6 or 4&gt;9) #一个条件为true则为true print(not 5&gt;6) #取反 if age&gt;=18 and age&lt;60: print("你成年了") print("你成年了") print("你成年了") elif age&gt;=60: print("老咯") else: print("未成年")</pre> <p> </p> <p><strong>9.list集合</strong></p> <pre>a = ['one', 'two', 'three'] # 初始化 print(a[0:]) # 截取 print(a[0:2]) # 取第一个元素和第二个元素,取值范围是 包头不包尾 a.append("four") # 在最后添加一个元素 print(a) a.insert(1, "five") # 将元素插在小标1的前面 print(a) a.remove("five") # 1.删除指定元素 print(a) dele = a.pop(1) # 2.指定下表删除 可以返回删掉的元素 print(dele) # del a #直接删除下表元素 或者直接删除集合 # a.clear #清空元素 print(a.index("one")) # 指定元素下表 print(a.count("one")) # 指定元素个数 print(len(a)) # 集合长度 print("one"in a) # 判断one在不在a中 a.reverse() # 倒序排列 print(a) x = [4, 8, 2, 6, 7, 1, 3, 9, 44] x.sort(reverse=True) # 冒泡排序默认小到大reverse=False reverse=True大到小排序 print(x) print(type(a) is list) # 判断类型a是不是list类型</pre> <p> </p> <p><strong>10.元组</strong></p> <p><strong>  和集合差不多,但是里面的元素不能修改。一般存放不想让用户修改的数据</strong></p> <pre># tupel 不能修改 只读 tup1 = (5,) # 只有一个元素建议加逗号 tup2 = (5, 1, 2, 3)</pre> <p> </p> <p><strong>11.字典</strong></p> <p><strong>  Python中唯一一个键值对的存储环境 类似于java的json</strong></p> <p> </p> <pre># 键值对 dic={'name':'yangzhuxian','age':18,'sex':'男'} dic['name']='zzh' print(dic['name']) dic['xxx']=0 print(dic) dic.setdefault('oo',99) # 去找oo这个元素 没有就创建 有就把以及存在的值返回出来(不插入新值) print(dic) print(dic.keys()) # dic.keys() 查看所有的键 print(dic.values()) # dic.keys() 查看所有的值 print(dic.items()) # 把所有key-value元素以元组形式显示出来 del dic['oo'] # 删除字典指定元素 print(dic)</pre> <p> </p> <p> </p> <p><strong>12.格式化输出字符串</strong></p> <pre># %s占位符 # %d整数占位符,不符合报错 # %f浮点数占位符,自动补充精度(30.000000) msg=''' --------------- Name:%s Age:%s ------------ '''%(name,age) print(msg)</pre> <p> </p> <p><strong>13.字符串内置方法</strong></p> <p> </p> <pre>st = 'helle pythen {name}' print(st.count('l')) # 'l'在字符串的个数 print(st.capitalize()) # 首字母大写 print(st.center(50, '-')) # 将字符串设置指定长度,本身长度不够就用‘-’在字符串左右填充 print(st.startswith('he')) # 判断以什么元素开头 返回布尔类型 print(st.endswith('en')) # 以什么元素结尾 返回布尔类型 print(st.find('p')) # 查找到第一个元素,返回索引值。没找到返回-1 print(st.format(name='yangzhuxian')) # 给字符串中的占位符赋值 print(st.format_map({'name':'jjc'})) # 给字符串中的占位符赋值 print(st.index('l')) # 作用和find一样,但是找不到会报错。find不会报错 print(st.isalnum()) # print(st.replace("{name}","")) # 替换 print('*'.join(['ty','yy'])) # 将数组以什么东西组合成字符串 print(st.rfind('l')) # 从右边往左边找 返回索引位置 print('My Name is YZX'.split(" ")) # 将字符串以什么为分割对象分开 变成集合['My', 'Name', 'is', 'YZX'] print('my name is YZX'.title()) # My Name Is Yzx 转化成title规则 print('\tMy Name is\n yzx '.strip()) # 去空格 print('My Name is yzx'.lower()) # 转化小写 print('My Name is yzx'.upper()) # 转化大写</pre> <p> </p> <div class="alert alert-success" role="alert"><p>来源:<code>https://www.cnblogs.com/yangzhuxian/p/12658609.html</code></p></div></div> <div class="field field--name-field-tags field--type-entity-reference field--label-above"> <div class="field--label">标签</div> <div class="field--items"> <div class="field--item"><a href="/tag/num" hreflang="zh-hans">num</a></div> <div class="field--item"><a href="/tag/python-forxunhuan" hreflang="zh-hans">python for循环</a></div> <div class="field--item"><a href="/tag/pythonhanshu" hreflang="zh-hans">python函数</a></div> <div class="field--item"><a href="/tag/python" hreflang="zh-hans">python</a></div> </div> </div> Wed, 08 Apr 2020 03:48:10 +0000 荒凉一梦 3556532 at https://www.e-learn.cn Python3 撸代码窍门,怎样用 Map, Filter, Reduce 代替 For 循环. https://www.e-learn.cn/topic/3556435 <span>Python3 撸代码窍门,怎样用 Map, Filter, Reduce 代替 For 循环.</span> <span><span lang="" about="/user/28" typeof="schema:Person" property="schema:name" datatype="">拈花ヽ惹草</span></span> <span>2020-04-08 10:52:24</span> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"> <p>感谢作者分享-<a href="http://bjbsair.com/2020-04-07/tech-info/30736.html" rel="nofollow">http://bjbsair.com/2020-04-07/tech-info/30736.html</a></p> <p></p><p></p><img class="b-lazy" data-src="https://www.eimg.top/images/2020/04/08/325bd6cbc4868e74d3972f95875be0b6.jpg" data-original="https://www.eimg.top/images/2020/04/08/325bd6cbc4868e74d3972f95875be0b6.jpg" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><p></p> <p>你是否有过这样的经历,你查看自己写的代码并看到满眼的 for 循环?你发现你必须斜着你的眼睛,并将脑袋前倾到你的显示器,以看得更清楚。</p> <p>反正我有过这样的经历。</p> <p>for 循环就像是一把瑞士军刀,它可以解决很多问题,但是,当你需要扫视代码,快速搞清楚代码所做的事情时,它们可能会让人不知所措。</p> <p>map、filter 和 reduce 这三种技术可以提供描述迭代原因的函数替代方案,以便避免过多的 for 循环。我之前在 JavaScript 中写过这些技术的入门文章,但是它们在 Python 中的实现略有不同。</p> <p>我们将简要介绍这三种技术,主要介绍它们在 JavaScript 和 Python 中的语法差异,然后给出如何转换 for 循环的示例。</p> <p><strong>什么是 Map、Filter 和 Reduce?</strong></p> <p>回顾我以前编写的代码,我意识到 95% 的时间都花在遍历字符串或数组上。在这种情况下,我会执行以下操作之一:将一系列语句映射到每个值,筛选满足特定条件的值,或将数据集减少为单个聚合值。</p> <p>有了这种洞察力,你就可以识别和实现这三种方法,即循环遍历通常属于这三种功能类别之一:</p> <ul><li>Map:对每个项应用相同的步骤集,存储结果</li> <li>Filter:应用验证条件,存储计算结果为 True 的项</li> <li>Reduce:返回一个从元素传递到元素的值</li> </ul><p><strong>为什么 Python Map/Filter/Reduce 会不一样?</strong></p> <p>在 Python 中,这三种技术作为函数存在,而不是数组或字符串类的方法。这意味着,你将编写 map (function, my_list),而不是编写 my_array.map(function)。</p> <p>此外,每个技术都需要传递一个函数,该函数将执行每个项目。通常,该函数是作为匿名函数(在 JavaScript 中称为 arrow 头函数)编写的。但是,在 Python 中,你经常看到被使用的是 lambda 表达式。</p> <p>lambda 表达式和 arrow 函数之间的语法实际上非常相似。将 =&gt; 替换为 : 并确保使用关键字 lambda,其余的几乎相同。</p> <blockquote> <p>// JavaScript Arrow Functionconst square = number =&gt; number * number;</p> <p>// Python Lambda Expressionsquare = lambda number: number * number</p> </blockquote> <p>arrow 函数和 lambda 表达式之间的一个关键区别是,arrow 函数能够通过多个语句扩展成完整的函数,而 lambda 表达式仅限于返回的单个表达式。因此,在使用 map()、filter()或 reduce()时,如果需要对每个项执行多个操作,请先定义函数,然后再包含它。</p> <blockquote> <p>def inefficientSquare(number): result = number * number return result</p> <p>map(inefficientSquare, my_list)</p> </blockquote> <p><strong>替换 for 循环</strong></p> <p>好了,下面来点好东西。下面是三个常见的 for 循环示例,它们将被 map、filter 和 reduce 替换。我们的编程目标:计算列表中奇数平方和。</p> <p>首先,使用 基本的 for 循环示例。注意:下面的代码纯粹是为了演示,即使没有 map/filter/reduce 也有改进空间。</p> <blockquote> <p>numbers = [1,2,3,4,5,6]odd_numbers = []squared_odd_numbers = []total = 0</p> <h1>filter for odd numbersfor number in numbers: if number % 2 == 1: odd_numbers.append(number)</h1> <h1>square all odd numbersfor number in odd_numbers: squared_odd_numbers.append(number * number)</h1> <h1>calculate totalfor number in squared_odd_numbers: total += number</h1> <h1>calculate average</h1> </blockquote> <p>让我们将每个步骤转换为这三个函数的其中之一:</p> <blockquote> <p>from functools import reduce</p> <p>numbers = [1,2,3,4,5,6]</p> <p>odd_numbers = filter(lambda n: n % 2 == 1, numbers)</p> <p>squared_odd_numbers = map(lambda n: n * n, odd_numbers)</p> <p>total = reduce(lambda acc, n: acc + n, squared_odd_numbers)</p> </blockquote> <p>有几个重要的语法要点要强调。</p> <ul><li>map()和 filter()本机可用。但是,reduce()必须从 Python 3 以上版本中的函数库导入</li> <li>lambda 表达式是所有三个函数中的第一个参数,iterable 是第二个参数</li> <li>reduce()的 lambda 表达式需要两个参数:累加器(传递给每个元素的值)和单个元素本身</li> </ul><p>记住,for 循环在代码中确实是很重要的,但是扩展工具包从来都不是坏事。</p> <p>如果你处于想学Python或者正在学习Python,下面是<strong>2020年最新Python教程</strong>学习一部分大纲:共分为4季,里面详细的讲解了Python的方方面面、学完可直接到达手写神经网络的地步**!**</p> <p></p><p></p><img class="b-lazy" data-src="https://www.eimg.top/images/2020/04/08/c2dba2d3bc118eca19ae502f5613c6da.jpg" data-original="https://www.eimg.top/images/2020/04/08/c2dba2d3bc118eca19ae502f5613c6da.jpg" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><p></p> <p>----------------------------------感谢作者分享-<a href="http://bjbsair.com/2020-04-07/tech-info/30736.html" rel="nofollow">http://bjbsair.com/2020-04-07/tech-info/30736.html</a></p> <p></p><p></p><img class="b-lazy" data-src="https://www.eimg.top/images/2020/04/08/0d2f580b14c823d84623ddf9e430aa02.jpg" data-original="https://www.eimg.top/images/2020/04/08/0d2f580b14c823d84623ddf9e430aa02.jpg" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><p></p> <p>你是否有过这样的经历,你查看自己写的代码并看到满眼的 for 循环?你发现你必须斜着你的眼睛,并将脑袋前倾到你的显示器,以看得更清楚。</p> <p>反正我有过这样的经历。</p> <p>for 循环就像是一把瑞士军刀,它可以解决很多问题,但是,当你需要扫视代码,快速搞清楚代码所做的事情时,它们可能会让人不知所措。</p> <p>map、filter 和 reduce 这三种技术可以提供描述迭代原因的函数替代方案,以便避免过多的 for 循环。我之前在 JavaScript 中写过这些技术的入门文章,但是它们在 Python 中的实现略有不同。</p> <p>我们将简要介绍这三种技术,主要介绍它们在 JavaScript 和 Python 中的语法差异,然后给出如何转换 for 循环的示例。</p> <p><strong>什么是 Map、Filter 和 Reduce?</strong></p> <p>回顾我以前编写的代码,我意识到 95% 的时间都花在遍历字符串或数组上。在这种情况下,我会执行以下操作之一:将一系列语句映射到每个值,筛选满足特定条件的值,或将数据集减少为单个聚合值。</p> <p>有了这种洞察力,你就可以识别和实现这三种方法,即循环遍历通常属于这三种功能类别之一:</p> <ul><li>Map:对每个项应用相同的步骤集,存储结果</li> <li>Filter:应用验证条件,存储计算结果为 True 的项</li> <li>Reduce:返回一个从元素传递到元素的值</li> </ul><p><strong>为什么 Python Map/Filter/Reduce 会不一样?</strong></p> <p>在 Python 中,这三种技术作为函数存在,而不是数组或字符串类的方法。这意味着,你将编写 map (function, my_list),而不是编写 my_array.map(function)。</p> <p>此外,每个技术都需要传递一个函数,该函数将执行每个项目。通常,该函数是作为匿名函数(在 JavaScript 中称为 arrow 头函数)编写的。但是,在 Python 中,你经常看到被使用的是 lambda 表达式。</p> <p>lambda 表达式和 arrow 函数之间的语法实际上非常相似。将 =&gt; 替换为 : 并确保使用关键字 lambda,其余的几乎相同。</p> <blockquote> <p>// JavaScript Arrow Functionconst square = number =&gt; number * number;</p> <p>// Python Lambda Expressionsquare = lambda number: number * number</p> </blockquote> <p>arrow 函数和 lambda 表达式之间的一个关键区别是,arrow 函数能够通过多个语句扩展成完整的函数,而 lambda 表达式仅限于返回的单个表达式。因此,在使用 map()、filter()或 reduce()时,如果需要对每个项执行多个操作,请先定义函数,然后再包含它。</p> <blockquote> <p>def inefficientSquare(number): result = number * number return result</p> <p>map(inefficientSquare, my_list)</p> </blockquote> <p><strong>替换 for 循环</strong></p> <p>好了,下面来点好东西。下面是三个常见的 for 循环示例,它们将被 map、filter 和 reduce 替换。我们的编程目标:计算列表中奇数平方和。</p> <p>首先,使用 基本的 for 循环示例。注意:下面的代码纯粹是为了演示,即使没有 map/filter/reduce 也有改进空间。</p> <blockquote> <p>numbers = [1,2,3,4,5,6]odd_numbers = []squared_odd_numbers = []total = 0</p> <h1>filter for odd numbersfor number in numbers: if number % 2 == 1: odd_numbers.append(number)</h1> <h1>square all odd numbersfor number in odd_numbers: squared_odd_numbers.append(number * number)</h1> <h1>calculate totalfor number in squared_odd_numbers: total += number</h1> <h1>calculate average</h1> </blockquote> <p>让我们将每个步骤转换为这三个函数的其中之一:</p> <blockquote> <p>from functools import reduce</p> <p>numbers = [1,2,3,4,5,6]</p> <p>odd_numbers = filter(lambda n: n % 2 == 1, numbers)</p> <p>squared_odd_numbers = map(lambda n: n * n, odd_numbers)</p> <p>total = reduce(lambda acc, n: acc + n, squared_odd_numbers)</p> </blockquote> <p>有几个重要的语法要点要强调。</p> <ul><li>map()和 filter()本机可用。但是,reduce()必须从 Python 3 以上版本中的函数库导入</li> <li>lambda 表达式是所有三个函数中的第一个参数,iterable 是第二个参数</li> <li>reduce()的 lambda 表达式需要两个参数:累加器(传递给每个元素的值)和单个元素本身</li> </ul><p>记住,for 循环在代码中确实是很重要的,但是扩展工具包从来都不是坏事。</p> <p>如果你处于想学Python或者正在学习Python,下面是<strong>2020年最新Python教程</strong>学习一部分大纲:共分为4季,里面详细的讲解了Python的方方面面、学完可直接到达手写神经网络的地步**!**</p> <p></p><p></p><img class="b-lazy" data-src="https://www.eimg.top/images/2020/04/08/835c4883a74c123f49a4442dd7de98ec.jpg" data-original="https://www.eimg.top/images/2020/04/08/835c4883a74c123f49a4442dd7de98ec.jpg" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><p></p> <p>----------------------------------感谢作者分享-<a href="http://bjbsair.com/2020-04-07/tech-info/30736.html" rel="nofollow">http://bjbsair.com/2020-04-07/tech-info/30736.html</a></p> <p></p><p></p><img class="b-lazy" data-src="https://www.eimg.top/images/2020/04/08/314a213fe59c0909768e46bb5aa01579.jpg" data-original="https://www.eimg.top/images/2020/04/08/314a213fe59c0909768e46bb5aa01579.jpg" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><p></p> <p>你是否有过这样的经历,你查看自己写的代码并看到满眼的 for 循环?你发现你必须斜着你的眼睛,并将脑袋前倾到你的显示器,以看得更清楚。</p> <p>反正我有过这样的经历。</p> <p>for 循环就像是一把瑞士军刀,它可以解决很多问题,但是,当你需要扫视代码,快速搞清楚代码所做的事情时,它们可能会让人不知所措。</p> <p>map、filter 和 reduce 这三种技术可以提供描述迭代原因的函数替代方案,以便避免过多的 for 循环。我之前在 JavaScript 中写过这些技术的入门文章,但是它们在 Python 中的实现略有不同。</p> <p>我们将简要介绍这三种技术,主要介绍它们在 JavaScript 和 Python 中的语法差异,然后给出如何转换 for 循环的示例。</p> <p><strong>什么是 Map、Filter 和 Reduce?</strong></p> <p>回顾我以前编写的代码,我意识到 95% 的时间都花在遍历字符串或数组上。在这种情况下,我会执行以下操作之一:将一系列语句映射到每个值,筛选满足特定条件的值,或将数据集减少为单个聚合值。</p> <p>有了这种洞察力,你就可以识别和实现这三种方法,即循环遍历通常属于这三种功能类别之一:</p> <ul><li>Map:对每个项应用相同的步骤集,存储结果</li> <li>Filter:应用验证条件,存储计算结果为 True 的项</li> <li>Reduce:返回一个从元素传递到元素的值</li> </ul><p><strong>为什么 Python Map/Filter/Reduce 会不一样?</strong></p> <p>在 Python 中,这三种技术作为函数存在,而不是数组或字符串类的方法。这意味着,你将编写 map (function, my_list),而不是编写 my_array.map(function)。</p> <p>此外,每个技术都需要传递一个函数,该函数将执行每个项目。通常,该函数是作为匿名函数(在 JavaScript 中称为 arrow 头函数)编写的。但是,在 Python 中,你经常看到被使用的是 lambda 表达式。</p> <p>lambda 表达式和 arrow 函数之间的语法实际上非常相似。将 =&gt; 替换为 : 并确保使用关键字 lambda,其余的几乎相同。</p> <blockquote> <p>// JavaScript Arrow Functionconst square = number =&gt; number * number;</p> <p>// Python Lambda Expressionsquare = lambda number: number * number</p> </blockquote> <p>arrow 函数和 lambda 表达式之间的一个关键区别是,arrow 函数能够通过多个语句扩展成完整的函数,而 lambda 表达式仅限于返回的单个表达式。因此,在使用 map()、filter()或 reduce()时,如果需要对每个项执行多个操作,请先定义函数,然后再包含它。</p> <blockquote> <p>def inefficientSquare(number): result = number * number return result</p> <p>map(inefficientSquare, my_list)</p> </blockquote> <p><strong>替换 for 循环</strong></p> <p>好了,下面来点好东西。下面是三个常见的 for 循环示例,它们将被 map、filter 和 reduce 替换。我们的编程目标:计算列表中奇数平方和。</p> <p>首先,使用 基本的 for 循环示例。注意:下面的代码纯粹是为了演示,即使没有 map/filter/reduce 也有改进空间。</p> <blockquote> <p>numbers = [1,2,3,4,5,6]odd_numbers = []squared_odd_numbers = []total = 0</p> <h1>filter for odd numbersfor number in numbers: if number % 2 == 1: odd_numbers.append(number)</h1> <h1>square all odd numbersfor number in odd_numbers: squared_odd_numbers.append(number * number)</h1> <h1>calculate totalfor number in squared_odd_numbers: total += number</h1> <h1>calculate average</h1> </blockquote> <p>让我们将每个步骤转换为这三个函数的其中之一:</p> <blockquote> <p>from functools import reduce</p> <p>numbers = [1,2,3,4,5,6]</p> <p>odd_numbers = filter(lambda n: n % 2 == 1, numbers)</p> <p>squared_odd_numbers = map(lambda n: n * n, odd_numbers)</p> <p>total = reduce(lambda acc, n: acc + n, squared_odd_numbers)</p> </blockquote> <p>有几个重要的语法要点要强调。</p> <ul><li>map()和 filter()本机可用。但是,reduce()必须从 Python 3 以上版本中的函数库导入</li> <li>lambda 表达式是所有三个函数中的第一个参数,iterable 是第二个参数</li> <li>reduce()的 lambda 表达式需要两个参数:累加器(传递给每个元素的值)和单个元素本身</li> </ul><p>记住,for 循环在代码中确实是很重要的,但是扩展工具包从来都不是坏事。</p> <p>如果你处于想学Python或者正在学习Python,下面是<strong>2020年最新Python教程</strong>学习一部分大纲:共分为4季,里面详细的讲解了Python的方方面面、学完可直接到达手写神经网络的地步**!**</p> <p></p><p></p><img class="b-lazy" data-src="https://www.eimg.top/images/2020/04/08/cce5a28cdffd4ea12f29b09dc5b7ea67.jpg" data-original="https://www.eimg.top/images/2020/04/08/cce5a28cdffd4ea12f29b09dc5b7ea67.jpg" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><p></p> <hr /><div class="alert alert-success" role="alert"><p>来源:<code>oschina</code></p><p>链接:<code>https://my.oschina.net/u/4478364/blog/3224465</code></p></div></div> <div class="field field--name-field-tags field--type-entity-reference field--label-above"> <div class="field--label">标签</div> <div class="field--items"> <div class="field--item"><a href="/tag/bianchengyuyan" hreflang="zh-hans">编程语言</a></div> <div class="field--item"><a href="/tag/python" hreflang="zh-hans">python</a></div> <div class="field--item"><a href="/tag/python-forxunhuan" hreflang="zh-hans">python for循环</a></div> <div class="field--item"><a href="/tag/lambda" hreflang="zh-hans">lambda</a></div> <div class="field--item"><a href="/tag/pythonhanshu" hreflang="zh-hans">python函数</a></div> <div class="field--item"><a href="/tag/forxunhuan" hreflang="zh-hans">for循环</a></div> </div> </div> Wed, 08 Apr 2020 02:52:24 +0000 拈花ヽ惹草 3556435 at https://www.e-learn.cn Keras学习手册(一),开篇-使用 Python3 的Deep Learning 库 https://www.e-learn.cn/topic/3555996 <span>Keras学习手册(一),开篇-使用 Python3 的Deep Learning 库</span> <span><span lang="" about="/user/166" typeof="schema:Person" property="schema:name" datatype="">跟風遠走</span></span> <span>2020-04-08 08:31:19</span> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"> <p>感谢作者分享-<a href="http://bjbsair.com/2020-04-07/tech-info/30656.html" rel="nofollow">http://bjbsair.com/2020-04-07/tech-info/30656.html</a></p> <p>===</p> <p></p><p></p><img class="b-lazy" data-src="https://www.eimg.top/images/2020/04/08/b7f6a682f1539f8cf75c5e62a28eecfa.jpg" data-original="https://www.eimg.top/images/2020/04/08/b7f6a682f1539f8cf75c5e62a28eecfa.jpg" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><p></p> <h2 id="你恰好发现了-keras。">你恰好发现了 Keras。</h2> <p>Keras 是一个用 Python 编写的高级神经网络 API,它能够以 TensorFlow, CNTK, 或者 Theano 作为后端运行。Keras 的开发重点是支持快速的实验。能够以最小的时延把你的想法转换为实验结果,是做好研究的关键。</p> <p>如果你在以下情况下需要深度学习库,请使用 Keras:</p> <ul><li>允许简单而快速的原型设计(由于用户友好,高度模块化,可扩展性)。</li> <li>同时支持卷积神经网络和循环神经网络,以及两者的组合。</li> <li>在 CPU 和 GPU 上无缝运行。</li> </ul><p>查看文档,请访问 Keras.io。</p> <p>Keras 兼容的 Python 版本: <strong>Python 2.7-3.6</strong>。</p> <hr /><h2 id="指导原则">指导原则</h2> <ul><li><strong>用户友好。</strong> Keras 是为人类而不是为机器设计的 API。它把用户体验放在首要和中心位置。Keras 遵循减少认知困难的最佳实践:它提供一致且简单的 API,将常见用例所需的用户操作数量降至最低,并且在用户错误时提供清晰和可操作的反馈。</li> <li><strong>模块化。</strong> 模型被理解为由独立的、完全可配置的模块构成的序列或图。这些模块可以以尽可能少的限制组装在一起。特别是神经网络层、损失函数、优化器、初始化方法、激活函数、正则化方法,它们都是可以结合起来构建新模型的模块。</li> <li><strong>易扩展性。</strong> 新的模块是很容易添加的(作为新的类和函数),现有的模块已经提供了充足的示例。由于能够轻松地创建可以提高表现力的新模块,Keras 更加适合高级研究。</li> <li><strong>基于 Python 实现。</strong> Keras 没有特定格式的单独配置文件。模型定义在 Python 代码中,这些代码紧凑,易于调试,并且易于扩展。</li> </ul><hr /><h2 id="快速开始:30-秒上手-keras">快速开始:30 秒上手 Keras</h2> <p>Keras 的核心数据结构是 <strong>model</strong>,一种组织网络层的方式。最简单的模型是 Sequential 顺序模型,它由多个网络层线性堆叠。对于更复杂的结构,你应该使用 Keras 函数式 API,它允许构建任意的神经网络图。</p> <p>Sequential 模型如下所示:</p> <pre>from keras.models import Sequential model = Sequential() </pre> <p>可以简单地使用 .add() 来堆叠模型:</p> <pre>from keras.layers import Dense model.add(Dense(units=64, activation='relu', input_dim=100)) model.add(Dense(units=10, activation='softmax')) </pre> <p>在完成了模型的构建后, 可以使用 .compile() 来配置学习过程:</p> <pre>model.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy']) </pre> <p>如果需要,你还可以进一步地配置你的优化器。Keras 的核心原则是使事情变得相当简单,同时又允许用户在需要的时候能够进行完全的控制(终极的控制是源代码的易扩展性)。</p> <pre>model.compile(loss=keras.losses.categorical_crossentropy, optimizer=keras.optimizers.SGD(lr=0.01, momentum=0.9, nesterov=True)) </pre> <p>现在,你可以批量地在训练数据上进行迭代了:</p> <pre># x_train 和 y_train 是 Numpy 数组 -- 就像在 Scikit-Learn API 中一样。 model.fit(x_train, y_train, epochs=5, batch_size=32) </pre> <p>或者,你可以手动地将批次的数据提供给模型:</p> <pre>model.train_on_batch(x_batch, y_batch) </pre> <p>只需一行代码就能评估模型性能:</p> <pre>loss_and_metrics = model.evaluate(x_test, y_test, batch_size=128) </pre> <p>或者对新的数据生成预测:</p> <pre>classes = model.predict(x_test, batch_size=128) </pre> <p>构建一个问答系统,一个图像分类模型,一个神经图灵机,或者其他的任何模型,就是这么的快。深度学习背后的思想很简单,那么它们的实现又何必要那么痛苦呢?</p> <p>有关 Keras 更深入的教程,请查看:</p> <ul><li>开始使用 Sequential 模型</li> <li>开始使用函数式 API</li> </ul><p>在代码仓库的 examples 目录中,你会找到更多高级模型:基于记忆网络的问答系统、基于栈式 LSTM 的文本生成等等。</p> <hr /><h2 id="安装指引">安装指引</h2> <p>在安装 Keras 之前,请安装以下后端引擎之一:TensorFlow,Theano,或者 CNTK。我们推荐 TensorFlow 后端。</p> <ul><li>TensorFlow 安装指引。</li> <li>Theano 安装指引。</li> <li>CNTK 安装指引。</li> </ul><p>你也可以考虑安装以下<strong>可选依赖</strong>:</p> <ul><li>cuDNN (如果你计划在 GPU 上运行 Keras,建议安装)。</li> <li>HDF5 和 h5py (如果你需要将 Keras 模型保存到磁盘,则需要这些)。</li> <li>graphviz 和 pydot (用于可视化工具绘制模型图)。</li> </ul><p>然后你就可以安装 Keras 本身了。有两种方法安装 Keras:</p> <ul><li><strong>使用 PyPI 安装 Keras (推荐):</strong></li> </ul><pre>sudo pip install keras </pre> <p>如果你使用 virtualenv 虚拟环境, 你可以避免使用 sudo:</p> <pre>pip install keras </pre> <ul><li><strong>或者:使用 GitHub 源码安装 Keras:</strong></li> </ul><p>首先,使用 git 来克隆 Keras:</p> <pre>git clone https://github.com/keras-team/keras.git </pre> <p>然后,cd 到 Keras 目录并且运行安装命令:</p> <pre>cd keras sudo python setup.py install </pre> <hr /><h2 id="配置你的-keras-后端">配置你的 Keras 后端</h2> <p>默认情况下,Keras 将使用 TensorFlow 作为其张量操作库。请跟随这些指引来配置其他 Keras 后端。</p> <hr /><h2 id="技术支持">技术支持</h2> <p>你可以提出问题并参与开发讨论:</p> <ul><li>Keras Google group。</li> <li>Keras Slack channel。 使用 这个链接 向该频道请求邀请函。</li> </ul><p>你也可以在 GitHub issues 中发布<strong>漏洞报告和新功能请求</strong>(仅限于此)。注意请先阅读规范文档。</p> <hr /><h2 id="为什么取名为-keras">为什么取名为 Keras?</h2> <p>Keras (κέρας) 在希腊语中意为 号角 。它来自古希腊和拉丁文学中的一个文学形象,首先出现于 《奥德赛》 中, 梦神 (Oneiroi, singular Oneiros) 从这两类人中分离出来:那些用虚幻的景象欺骗人类,通过象牙之门抵达地球之人,以及那些宣告未来即将到来,通过号角之门抵达之人。 它类似于文字寓意,κέρας (号角) / κραίνω (履行),以及 ἐλέφας (象牙) / ἐλεφαίρομαι (欺骗)。</p> <p>Keras 最初是作为 ONEIROS 项目(开放式神经电子智能机器人操作系统)研究工作的一部分而开发的。</p> <blockquote> <p>"Oneiroi 超出了我们的理解 - 谁能确定它们讲述了什么故事?并不是所有人都能找到。那里有两扇门,就是通往短暂的 Oneiroi 的通道;一个是用号角制造的,一个是用象牙制造的。穿过尖锐的象牙的 Oneiroi 是诡计多端的,他们带有一些不会实现的信息; 那些穿过抛光的喇叭出来的人背后具有真理,对于看到他们的人来说是完成的。" Homer, Odyssey 19. 562 ff (Shewring translation).</p> </blockquote> <h1 id="为什么选择-keras?">为什么选择 Keras?</h1> <p>在如今无数深度学习框架中,为什么要使用 Keras 而非其他?以下是 Keras 与现有替代品的一些比较。</p> <hr /><h2 id="keras-优先考虑开发人员的经验">Keras 优先考虑开发人员的经验</h2> <ul><li>Keras 是为人类而非机器设计的 API。Keras 遵循减少认知困难的最佳实践: 它提供一致且简单的 API,它将常见用例所需的用户操作数量降至最低,并且在用户错误时提供清晰和可操作的反馈。</li> <li>这使 Keras 易于学习和使用。作为 Keras 用户,你的工作效率更高,能够比竞争对手更快地尝试更多创意,从而帮助你赢得机器学习竞赛。</li> <li>这种易用性并不以降低灵活性为代价:因为 Keras 与底层深度学习语言(特别是 TensorFlow)集成在一起,所以它可以让你实现任何你可以用基础语言编写的东西。特别是,tf.keras 作为 Keras API 可以与 TensorFlow 工作流无缝集成。</li> </ul><hr /><h2 id="keras-被工业界和学术界广泛采用">Keras 被工业界和学术界广泛采用</h2> <p></p><p></p><img class="b-lazy" data-src="https://www.eimg.top/images/2020/04/08/602953280bd3bc9e0e7bb29d61ef11f8.jpg" data-original="https://www.eimg.top/images/2020/04/08/602953280bd3bc9e0e7bb29d61ef11f8.jpg" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><p></p> <p>Deep learning 框架排名,由 Jeff Hale 基于 7 个分类的 11 个数据源计算得出</p> <p>截至 2018 年中期,Keras 拥有超过 250,000 名个人用户。与其他任何深度学习框架相比,Keras 在行业和研究领域的应用率更高(除 TensorFlow 之外,且 Keras API 是 TensorFlow 的官方前端,通过 tf.keras 模块使用)。</p> <p>您已经不断与使用 Keras 构建的功能进行交互 - 它在 Netflix, Uber, Yelp, Instacart, Zocdoc, Square 等众多网站上使用。它尤其受以深度学习作为产品核心的创业公司的欢迎。</p> <p>Keras也是深度学习研究人员的最爱,在上载到预印本服务器 arXiv.org 的科学论文中被提及的次数位居第二。Keras 还被大型科学组织的研究人员采用,特别是 CERN 和 NASA。</p> <hr /><h2 id="keras-可以轻松将模型转化为产品">Keras 可以轻松将模型转化为产品</h2> <p>与任何其他深度学习框架相比,你的 Keras 模型可以在更广泛的平台上轻松部署:</p> <ul><li>在 iOS 上,通过 Apple’s CoreML(苹果为 Keras 提供官方支持)。这里有一个教程。</li> <li>在 Android 上,通过 TensorFlow Android runtime,例如:Not Hotdog app。</li> <li>在浏览器中,通过 GPU 加速的 JavaScript 运行时,例如:Keras.js 和 WebDNN。</li> <li>在 Google Cloud 上,通过 TensorFlow-Serving。</li> <li>在 Python webapp 后端(比如 Flask app)中。</li> <li>在 JVM 上,通过 SkyMind 提供的 DL4J 模型导入。</li> <li>在 Raspberry Pi 树莓派上。</li> </ul><hr /><h2 id="keras-支持多个后端引擎,不会将你锁定到一个生态系统中">Keras 支持多个后端引擎,不会将你锁定到一个生态系统中</h2> <p>你的 Keras 模型可以基于不同的深度学习后端开发。重要的是,任何仅利用内置层构建的 Keras 模型,都可以在所有这些后端中移植:你可以用一种后端训练模型,再将它载入另一种后端中(例如为了发布的需要)。支持的后端有:</p> <ul><li>谷歌的 TensorFlow 后端</li> <li>微软的 CNTK 后端</li> <li>Theano 后端</li> </ul><p>亚马逊也正在为 Keras 开发 MXNet 后端。</p> <p>如此一来,你的 Keras 模型可以在 CPU 之外的不同硬件平台上训练:</p> <ul><li>NVIDIA GPU</li> <li>Google TPU,通过 TensorFlow 后端和 Google Cloud</li> <li>OpenCL 支持的 GPU, 比如 AMD, 通过 PlaidML Keras 后端</li> </ul><hr /><h2 id="keras-拥有强大的多-gpu-和分布式训练支持">Keras 拥有强大的多 GPU 和分布式训练支持</h2> <ul><li>Keras 内置对多 GPU 数据并行的支持。</li> <li>优步的 Horovod 对 Keras 模型拥有一流的支持。</li> <li>Keras 模型可以被转换为 TensorFlow Estimators 并在 Google Cloud 的 GPU 集群上训练。</li> <li>Keras 可以在 Spark(通过 CERN 的 Dist-Keras)和 Elephas 上运行。</li> </ul><hr /><h2 id="keras-的发展得到深度学习生态系统中的关键公司的支持">Keras 的发展得到深度学习生态系统中的关键公司的支持</h2> <p>Keras 的开发主要由谷歌支持,Keras API 以 tf.keras 的形式包装在 TensorFlow 中。此外,微软维护着 Keras 的 CNTK 后端。亚马逊 AWS 正在开发 MXNet 支持。其他提供支持的公司包括 NVIDIA、优步、苹果(通过 CoreML)等。</p> <p></p><p></p><img class="b-lazy" data-src="https://www.eimg.top/images/2020/04/08/980e6b632a63f4ac57a662d2fac015c4.jpg" data-original="https://www.eimg.top/images/2020/04/08/980e6b632a63f4ac57a662d2fac015c4.jpg" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><p></p> <p></p><p></p><img class="b-lazy" data-src="https://www.eimg.top/images/2020/04/08/84ea818d0d1970ad25ce3aad774003e7.jpg" data-original="https://www.eimg.top/images/2020/04/08/84ea818d0d1970ad25ce3aad774003e7.jpg" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><p></p> <p></p><p></p><img class="b-lazy" data-src="https://www.eimg.top/images/2020/04/08/3f057d7a4a575a4741f059497511d85d.jpg" data-original="https://www.eimg.top/images/2020/04/08/3f057d7a4a575a4741f059497511d85d.jpg" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><p></p> <p></p><p></p><img class="b-lazy" data-src="https://www.eimg.top/images/2020/04/08/c3da03c1df268d1a9bab4d3868500cd5.jpg" data-original="https://www.eimg.top/images/2020/04/08/c3da03c1df268d1a9bab4d3868500cd5.jpg" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><p></p>感谢作者分享-<a href="http://bjbsair.com/2020-04-07/tech-info/30656.html" rel="nofollow">http://bjbsair.com/2020-04-07/tech-info/30656.html</a> <p>===</p> <p></p><p></p><img class="b-lazy" data-src="https://www.eimg.top/images/2020/04/08/7ed1036c02117a935827f2a47a435f65.jpg" data-original="https://www.eimg.top/images/2020/04/08/7ed1036c02117a935827f2a47a435f65.jpg" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><p></p> <h2 id="你恰好发现了-keras。-2">你恰好发现了 Keras。</h2> <p>Keras 是一个用 Python 编写的高级神经网络 API,它能够以 TensorFlow, CNTK, 或者 Theano 作为后端运行。Keras 的开发重点是支持快速的实验。能够以最小的时延把你的想法转换为实验结果,是做好研究的关键。</p> <p>如果你在以下情况下需要深度学习库,请使用 Keras:</p> <ul><li>允许简单而快速的原型设计(由于用户友好,高度模块化,可扩展性)。</li> <li>同时支持卷积神经网络和循环神经网络,以及两者的组合。</li> <li>在 CPU 和 GPU 上无缝运行。</li> </ul><p>查看文档,请访问 Keras.io。</p> <p>Keras 兼容的 Python 版本: <strong>Python 2.7-3.6</strong>。</p> <hr /><h2 id="指导原则-2">指导原则</h2> <ul><li><strong>用户友好。</strong> Keras 是为人类而不是为机器设计的 API。它把用户体验放在首要和中心位置。Keras 遵循减少认知困难的最佳实践:它提供一致且简单的 API,将常见用例所需的用户操作数量降至最低,并且在用户错误时提供清晰和可操作的反馈。</li> <li><strong>模块化。</strong> 模型被理解为由独立的、完全可配置的模块构成的序列或图。这些模块可以以尽可能少的限制组装在一起。特别是神经网络层、损失函数、优化器、初始化方法、激活函数、正则化方法,它们都是可以结合起来构建新模型的模块。</li> <li><strong>易扩展性。</strong> 新的模块是很容易添加的(作为新的类和函数),现有的模块已经提供了充足的示例。由于能够轻松地创建可以提高表现力的新模块,Keras 更加适合高级研究。</li> <li><strong>基于 Python 实现。</strong> Keras 没有特定格式的单独配置文件。模型定义在 Python 代码中,这些代码紧凑,易于调试,并且易于扩展。</li> </ul><hr /><h2 id="快速开始:30-秒上手-keras-2">快速开始:30 秒上手 Keras</h2> <p>Keras 的核心数据结构是 <strong>model</strong>,一种组织网络层的方式。最简单的模型是 Sequential 顺序模型,它由多个网络层线性堆叠。对于更复杂的结构,你应该使用 Keras 函数式 API,它允许构建任意的神经网络图。</p> <p>Sequential 模型如下所示:</p> <pre>from keras.models import Sequential model = Sequential() </pre> <p>可以简单地使用 .add() 来堆叠模型:</p> <pre>from keras.layers import Dense model.add(Dense(units=64, activation='relu', input_dim=100)) model.add(Dense(units=10, activation='softmax')) </pre> <p>在完成了模型的构建后, 可以使用 .compile() 来配置学习过程:</p> <pre>model.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy']) </pre> <p>如果需要,你还可以进一步地配置你的优化器。Keras 的核心原则是使事情变得相当简单,同时又允许用户在需要的时候能够进行完全的控制(终极的控制是源代码的易扩展性)。</p> <pre>model.compile(loss=keras.losses.categorical_crossentropy, optimizer=keras.optimizers.SGD(lr=0.01, momentum=0.9, nesterov=True)) </pre> <p>现在,你可以批量地在训练数据上进行迭代了:</p> <pre># x_train 和 y_train 是 Numpy 数组 -- 就像在 Scikit-Learn API 中一样。 model.fit(x_train, y_train, epochs=5, batch_size=32) </pre> <p>或者,你可以手动地将批次的数据提供给模型:</p> <pre>model.train_on_batch(x_batch, y_batch) </pre> <p>只需一行代码就能评估模型性能:</p> <pre>loss_and_metrics = model.evaluate(x_test, y_test, batch_size=128) </pre> <p>或者对新的数据生成预测:</p> <pre>classes = model.predict(x_test, batch_size=128) </pre> <p>构建一个问答系统,一个图像分类模型,一个神经图灵机,或者其他的任何模型,就是这么的快。深度学习背后的思想很简单,那么它们的实现又何必要那么痛苦呢?</p> <p>有关 Keras 更深入的教程,请查看:</p> <ul><li>开始使用 Sequential 模型</li> <li>开始使用函数式 API</li> </ul><p>在代码仓库的 examples 目录中,你会找到更多高级模型:基于记忆网络的问答系统、基于栈式 LSTM 的文本生成等等。</p> <hr /><h2 id="安装指引-2">安装指引</h2> <p>在安装 Keras 之前,请安装以下后端引擎之一:TensorFlow,Theano,或者 CNTK。我们推荐 TensorFlow 后端。</p> <ul><li>TensorFlow 安装指引。</li> <li>Theano 安装指引。</li> <li>CNTK 安装指引。</li> </ul><p>你也可以考虑安装以下<strong>可选依赖</strong>:</p> <ul><li>cuDNN (如果你计划在 GPU 上运行 Keras,建议安装)。</li> <li>HDF5 和 h5py (如果你需要将 Keras 模型保存到磁盘,则需要这些)。</li> <li>graphviz 和 pydot (用于可视化工具绘制模型图)。</li> </ul><p>然后你就可以安装 Keras 本身了。有两种方法安装 Keras:</p> <ul><li><strong>使用 PyPI 安装 Keras (推荐):</strong></li> </ul><pre>sudo pip install keras </pre> <p>如果你使用 virtualenv 虚拟环境, 你可以避免使用 sudo:</p> <pre>pip install keras </pre> <ul><li><strong>或者:使用 GitHub 源码安装 Keras:</strong></li> </ul><p>首先,使用 git 来克隆 Keras:</p> <pre>git clone https://github.com/keras-team/keras.git </pre> <p>然后,cd 到 Keras 目录并且运行安装命令:</p> <pre>cd keras sudo python setup.py install </pre> <hr /><h2 id="配置你的-keras-后端-2">配置你的 Keras 后端</h2> <p>默认情况下,Keras 将使用 TensorFlow 作为其张量操作库。请跟随这些指引来配置其他 Keras 后端。</p> <hr /><h2 id="技术支持-2">技术支持</h2> <p>你可以提出问题并参与开发讨论:</p> <ul><li>Keras Google group。</li> <li>Keras Slack channel。 使用 这个链接 向该频道请求邀请函。</li> </ul><p>你也可以在 GitHub issues 中发布<strong>漏洞报告和新功能请求</strong>(仅限于此)。注意请先阅读规范文档。</p> <hr /><h2 id="为什么取名为-keras-2">为什么取名为 Keras?</h2> <p>Keras (κέρας) 在希腊语中意为 号角 。它来自古希腊和拉丁文学中的一个文学形象,首先出现于 《奥德赛》 中, 梦神 (Oneiroi, singular Oneiros) 从这两类人中分离出来:那些用虚幻的景象欺骗人类,通过象牙之门抵达地球之人,以及那些宣告未来即将到来,通过号角之门抵达之人。 它类似于文字寓意,κέρας (号角) / κραίνω (履行),以及 ἐλέφας (象牙) / ἐλεφαίρομαι (欺骗)。</p> <p>Keras 最初是作为 ONEIROS 项目(开放式神经电子智能机器人操作系统)研究工作的一部分而开发的。</p> <blockquote> <p>"Oneiroi 超出了我们的理解 - 谁能确定它们讲述了什么故事?并不是所有人都能找到。那里有两扇门,就是通往短暂的 Oneiroi 的通道;一个是用号角制造的,一个是用象牙制造的。穿过尖锐的象牙的 Oneiroi 是诡计多端的,他们带有一些不会实现的信息; 那些穿过抛光的喇叭出来的人背后具有真理,对于看到他们的人来说是完成的。" Homer, Odyssey 19. 562 ff (Shewring translation).</p> </blockquote> <h1 id="为什么选择-keras?-2">为什么选择 Keras?</h1> <p>在如今无数深度学习框架中,为什么要使用 Keras 而非其他?以下是 Keras 与现有替代品的一些比较。</p> <hr /><h2 id="keras-优先考虑开发人员的经验-2">Keras 优先考虑开发人员的经验</h2> <ul><li>Keras 是为人类而非机器设计的 API。Keras 遵循减少认知困难的最佳实践: 它提供一致且简单的 API,它将常见用例所需的用户操作数量降至最低,并且在用户错误时提供清晰和可操作的反馈。</li> <li>这使 Keras 易于学习和使用。作为 Keras 用户,你的工作效率更高,能够比竞争对手更快地尝试更多创意,从而帮助你赢得机器学习竞赛。</li> <li>这种易用性并不以降低灵活性为代价:因为 Keras 与底层深度学习语言(特别是 TensorFlow)集成在一起,所以它可以让你实现任何你可以用基础语言编写的东西。特别是,tf.keras 作为 Keras API 可以与 TensorFlow 工作流无缝集成。</li> </ul><hr /><h2 id="keras-被工业界和学术界广泛采用-2">Keras 被工业界和学术界广泛采用</h2> <p></p><p></p><img class="b-lazy" data-src="https://www.eimg.top/images/2020/04/08/3933da1e52f1f76a904bca8fc0e7b18a.jpg" data-original="https://www.eimg.top/images/2020/04/08/3933da1e52f1f76a904bca8fc0e7b18a.jpg" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><p></p> <p>Deep learning 框架排名,由 Jeff Hale 基于 7 个分类的 11 个数据源计算得出</p> <p>截至 2018 年中期,Keras 拥有超过 250,000 名个人用户。与其他任何深度学习框架相比,Keras 在行业和研究领域的应用率更高(除 TensorFlow 之外,且 Keras API 是 TensorFlow 的官方前端,通过 tf.keras 模块使用)。</p> <p>您已经不断与使用 Keras 构建的功能进行交互 - 它在 Netflix, Uber, Yelp, Instacart, Zocdoc, Square 等众多网站上使用。它尤其受以深度学习作为产品核心的创业公司的欢迎。</p> <p>Keras也是深度学习研究人员的最爱,在上载到预印本服务器 arXiv.org 的科学论文中被提及的次数位居第二。Keras 还被大型科学组织的研究人员采用,特别是 CERN 和 NASA。</p> <hr /><h2 id="keras-可以轻松将模型转化为产品-2">Keras 可以轻松将模型转化为产品</h2> <p>与任何其他深度学习框架相比,你的 Keras 模型可以在更广泛的平台上轻松部署:</p> <ul><li>在 iOS 上,通过 Apple’s CoreML(苹果为 Keras 提供官方支持)。这里有一个教程。</li> <li>在 Android 上,通过 TensorFlow Android runtime,例如:Not Hotdog app。</li> <li>在浏览器中,通过 GPU 加速的 JavaScript 运行时,例如:Keras.js 和 WebDNN。</li> <li>在 Google Cloud 上,通过 TensorFlow-Serving。</li> <li>在 Python webapp 后端(比如 Flask app)中。</li> <li>在 JVM 上,通过 SkyMind 提供的 DL4J 模型导入。</li> <li>在 Raspberry Pi 树莓派上。</li> </ul><hr /><h2 id="keras-支持多个后端引擎,不会将你锁定到一个生态系统中-2">Keras 支持多个后端引擎,不会将你锁定到一个生态系统中</h2> <p>你的 Keras 模型可以基于不同的深度学习后端开发。重要的是,任何仅利用内置层构建的 Keras 模型,都可以在所有这些后端中移植:你可以用一种后端训练模型,再将它载入另一种后端中(例如为了发布的需要)。支持的后端有:</p> <ul><li>谷歌的 TensorFlow 后端</li> <li>微软的 CNTK 后端</li> <li>Theano 后端</li> </ul><p>亚马逊也正在为 Keras 开发 MXNet 后端。</p> <p>如此一来,你的 Keras 模型可以在 CPU 之外的不同硬件平台上训练:</p> <ul><li>NVIDIA GPU</li> <li>Google TPU,通过 TensorFlow 后端和 Google Cloud</li> <li>OpenCL 支持的 GPU, 比如 AMD, 通过 PlaidML Keras 后端</li> </ul><hr /><h2 id="keras-拥有强大的多-gpu-和分布式训练支持-2">Keras 拥有强大的多 GPU 和分布式训练支持</h2> <ul><li>Keras 内置对多 GPU 数据并行的支持。</li> <li>优步的 Horovod 对 Keras 模型拥有一流的支持。</li> <li>Keras 模型可以被转换为 TensorFlow Estimators 并在 Google Cloud 的 GPU 集群上训练。</li> <li>Keras 可以在 Spark(通过 CERN 的 Dist-Keras)和 Elephas 上运行。</li> </ul><hr /><h2 id="keras-的发展得到深度学习生态系统中的关键公司的支持-2">Keras 的发展得到深度学习生态系统中的关键公司的支持</h2> <p>Keras 的开发主要由谷歌支持,Keras API 以 tf.keras 的形式包装在 TensorFlow 中。此外,微软维护着 Keras 的 CNTK 后端。亚马逊 AWS 正在开发 MXNet 支持。其他提供支持的公司包括 NVIDIA、优步、苹果(通过 CoreML)等。</p> <p></p><p></p><img class="b-lazy" data-src="https://www.eimg.top/images/2020/04/08/6f678395e782c83912653e9734f1790a.jpg" data-original="https://www.eimg.top/images/2020/04/08/6f678395e782c83912653e9734f1790a.jpg" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><p></p> <p></p><p></p><img class="b-lazy" data-src="https://www.eimg.top/images/2020/04/08/444ba2fa9caf638bed12bd6d65ce553e.jpg" data-original="https://www.eimg.top/images/2020/04/08/444ba2fa9caf638bed12bd6d65ce553e.jpg" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><p></p> <p></p><p></p><img class="b-lazy" data-src="https://www.eimg.top/images/2020/04/08/dd38644b797bc1291a169a30ff8d89ab.jpg" data-original="https://www.eimg.top/images/2020/04/08/dd38644b797bc1291a169a30ff8d89ab.jpg" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><p></p> <p></p><p></p><img class="b-lazy" data-src="https://www.eimg.top/images/2020/04/08/4122c51d6a78032e88eb925e228d041f.jpg" data-original="https://www.eimg.top/images/2020/04/08/4122c51d6a78032e88eb925e228d041f.jpg" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><p></p>感谢作者分享-<a href="http://bjbsair.com/2020-04-07/tech-info/30656.html" rel="nofollow">http://bjbsair.com/2020-04-07/tech-info/30656.html</a> <p>===</p> <p></p><p></p><img class="b-lazy" data-src="https://www.eimg.top/images/2020/04/08/1de9ba55f4a4fb187ab315b3046440ff.jpg" data-original="https://www.eimg.top/images/2020/04/08/1de9ba55f4a4fb187ab315b3046440ff.jpg" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><p></p> <h2 id="你恰好发现了-keras。-3">你恰好发现了 Keras。</h2> <p>Keras 是一个用 Python 编写的高级神经网络 API,它能够以 TensorFlow, CNTK, 或者 Theano 作为后端运行。Keras 的开发重点是支持快速的实验。能够以最小的时延把你的想法转换为实验结果,是做好研究的关键。</p> <p>如果你在以下情况下需要深度学习库,请使用 Keras:</p> <ul><li>允许简单而快速的原型设计(由于用户友好,高度模块化,可扩展性)。</li> <li>同时支持卷积神经网络和循环神经网络,以及两者的组合。</li> <li>在 CPU 和 GPU 上无缝运行。</li> </ul><p>查看文档,请访问 Keras.io。</p> <p>Keras 兼容的 Python 版本: <strong>Python 2.7-3.6</strong>。</p> <hr /><h2 id="指导原则-3">指导原则</h2> <ul><li><strong>用户友好。</strong> Keras 是为人类而不是为机器设计的 API。它把用户体验放在首要和中心位置。Keras 遵循减少认知困难的最佳实践:它提供一致且简单的 API,将常见用例所需的用户操作数量降至最低,并且在用户错误时提供清晰和可操作的反馈。</li> <li><strong>模块化。</strong> 模型被理解为由独立的、完全可配置的模块构成的序列或图。这些模块可以以尽可能少的限制组装在一起。特别是神经网络层、损失函数、优化器、初始化方法、激活函数、正则化方法,它们都是可以结合起来构建新模型的模块。</li> <li><strong>易扩展性。</strong> 新的模块是很容易添加的(作为新的类和函数),现有的模块已经提供了充足的示例。由于能够轻松地创建可以提高表现力的新模块,Keras 更加适合高级研究。</li> <li><strong>基于 Python 实现。</strong> Keras 没有特定格式的单独配置文件。模型定义在 Python 代码中,这些代码紧凑,易于调试,并且易于扩展。</li> </ul><hr /><h2 id="快速开始:30-秒上手-keras-3">快速开始:30 秒上手 Keras</h2> <p>Keras 的核心数据结构是 <strong>model</strong>,一种组织网络层的方式。最简单的模型是 Sequential 顺序模型,它由多个网络层线性堆叠。对于更复杂的结构,你应该使用 Keras 函数式 API,它允许构建任意的神经网络图。</p> <p>Sequential 模型如下所示:</p> <pre>from keras.models import Sequential model = Sequential() </pre> <p>可以简单地使用 .add() 来堆叠模型:</p> <pre>from keras.layers import Dense model.add(Dense(units=64, activation='relu', input_dim=100)) model.add(Dense(units=10, activation='softmax')) </pre> <p>在完成了模型的构建后, 可以使用 .compile() 来配置学习过程:</p> <pre>model.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy']) </pre> <p>如果需要,你还可以进一步地配置你的优化器。Keras 的核心原则是使事情变得相当简单,同时又允许用户在需要的时候能够进行完全的控制(终极的控制是源代码的易扩展性)。</p> <pre>model.compile(loss=keras.losses.categorical_crossentropy, optimizer=keras.optimizers.SGD(lr=0.01, momentum=0.9, nesterov=True)) </pre> <p>现在,你可以批量地在训练数据上进行迭代了:</p> <pre># x_train 和 y_train 是 Numpy 数组 -- 就像在 Scikit-Learn API 中一样。 model.fit(x_train, y_train, epochs=5, batch_size=32) </pre> <p>或者,你可以手动地将批次的数据提供给模型:</p> <pre>model.train_on_batch(x_batch, y_batch) </pre> <p>只需一行代码就能评估模型性能:</p> <pre>loss_and_metrics = model.evaluate(x_test, y_test, batch_size=128) </pre> <p>或者对新的数据生成预测:</p> <pre>classes = model.predict(x_test, batch_size=128) </pre> <p>构建一个问答系统,一个图像分类模型,一个神经图灵机,或者其他的任何模型,就是这么的快。深度学习背后的思想很简单,那么它们的实现又何必要那么痛苦呢?</p> <p>有关 Keras 更深入的教程,请查看:</p> <ul><li>开始使用 Sequential 模型</li> <li>开始使用函数式 API</li> </ul><p>在代码仓库的 examples 目录中,你会找到更多高级模型:基于记忆网络的问答系统、基于栈式 LSTM 的文本生成等等。</p> <hr /><h2 id="安装指引-3">安装指引</h2> <p>在安装 Keras 之前,请安装以下后端引擎之一:TensorFlow,Theano,或者 CNTK。我们推荐 TensorFlow 后端。</p> <ul><li>TensorFlow 安装指引。</li> <li>Theano 安装指引。</li> <li>CNTK 安装指引。</li> </ul><p>你也可以考虑安装以下<strong>可选依赖</strong>:</p> <ul><li>cuDNN (如果你计划在 GPU 上运行 Keras,建议安装)。</li> <li>HDF5 和 h5py (如果你需要将 Keras 模型保存到磁盘,则需要这些)。</li> <li>graphviz 和 pydot (用于可视化工具绘制模型图)。</li> </ul><p>然后你就可以安装 Keras 本身了。有两种方法安装 Keras:</p> <ul><li><strong>使用 PyPI 安装 Keras (推荐):</strong></li> </ul><pre>sudo pip install keras </pre> <p>如果你使用 virtualenv 虚拟环境, 你可以避免使用 sudo:</p> <pre>pip install keras </pre> <ul><li><strong>或者:使用 GitHub 源码安装 Keras:</strong></li> </ul><p>首先,使用 git 来克隆 Keras:</p> <pre>git clone https://github.com/keras-team/keras.git </pre> <p>然后,cd 到 Keras 目录并且运行安装命令:</p> <pre>cd keras sudo python setup.py install </pre> <hr /><h2 id="配置你的-keras-后端-3">配置你的 Keras 后端</h2> <p>默认情况下,Keras 将使用 TensorFlow 作为其张量操作库。请跟随这些指引来配置其他 Keras 后端。</p> <hr /><h2 id="技术支持-3">技术支持</h2> <p>你可以提出问题并参与开发讨论:</p> <ul><li>Keras Google group。</li> <li>Keras Slack channel。 使用 这个链接 向该频道请求邀请函。</li> </ul><p>你也可以在 GitHub issues 中发布<strong>漏洞报告和新功能请求</strong>(仅限于此)。注意请先阅读规范文档。</p> <hr /><h2 id="为什么取名为-keras-3">为什么取名为 Keras?</h2> <p>Keras (κέρας) 在希腊语中意为 号角 。它来自古希腊和拉丁文学中的一个文学形象,首先出现于 《奥德赛》 中, 梦神 (Oneiroi, singular Oneiros) 从这两类人中分离出来:那些用虚幻的景象欺骗人类,通过象牙之门抵达地球之人,以及那些宣告未来即将到来,通过号角之门抵达之人。 它类似于文字寓意,κέρας (号角) / κραίνω (履行),以及 ἐλέφας (象牙) / ἐλεφαίρομαι (欺骗)。</p> <p>Keras 最初是作为 ONEIROS 项目(开放式神经电子智能机器人操作系统)研究工作的一部分而开发的。</p> <blockquote> <p>"Oneiroi 超出了我们的理解 - 谁能确定它们讲述了什么故事?并不是所有人都能找到。那里有两扇门,就是通往短暂的 Oneiroi 的通道;一个是用号角制造的,一个是用象牙制造的。穿过尖锐的象牙的 Oneiroi 是诡计多端的,他们带有一些不会实现的信息; 那些穿过抛光的喇叭出来的人背后具有真理,对于看到他们的人来说是完成的。" Homer, Odyssey 19. 562 ff (Shewring translation).</p> </blockquote> <h1 id="为什么选择-keras?-3">为什么选择 Keras?</h1> <p>在如今无数深度学习框架中,为什么要使用 Keras 而非其他?以下是 Keras 与现有替代品的一些比较。</p> <hr /><h2 id="keras-优先考虑开发人员的经验-3">Keras 优先考虑开发人员的经验</h2> <ul><li>Keras 是为人类而非机器设计的 API。Keras 遵循减少认知困难的最佳实践: 它提供一致且简单的 API,它将常见用例所需的用户操作数量降至最低,并且在用户错误时提供清晰和可操作的反馈。</li> <li>这使 Keras 易于学习和使用。作为 Keras 用户,你的工作效率更高,能够比竞争对手更快地尝试更多创意,从而帮助你赢得机器学习竞赛。</li> <li>这种易用性并不以降低灵活性为代价:因为 Keras 与底层深度学习语言(特别是 TensorFlow)集成在一起,所以它可以让你实现任何你可以用基础语言编写的东西。特别是,tf.keras 作为 Keras API 可以与 TensorFlow 工作流无缝集成。</li> </ul><hr /><h2 id="keras-被工业界和学术界广泛采用-3">Keras 被工业界和学术界广泛采用</h2> <p></p><p></p><img class="b-lazy" data-src="https://www.eimg.top/images/2020/04/08/7128213970c0385fdd8b885f4f1de632.jpg" data-original="https://www.eimg.top/images/2020/04/08/7128213970c0385fdd8b885f4f1de632.jpg" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><p></p> <p>Deep learning 框架排名,由 Jeff Hale 基于 7 个分类的 11 个数据源计算得出</p> <p>截至 2018 年中期,Keras 拥有超过 250,000 名个人用户。与其他任何深度学习框架相比,Keras 在行业和研究领域的应用率更高(除 TensorFlow 之外,且 Keras API 是 TensorFlow 的官方前端,通过 tf.keras 模块使用)。</p> <p>您已经不断与使用 Keras 构建的功能进行交互 - 它在 Netflix, Uber, Yelp, Instacart, Zocdoc, Square 等众多网站上使用。它尤其受以深度学习作为产品核心的创业公司的欢迎。</p> <p>Keras也是深度学习研究人员的最爱,在上载到预印本服务器 arXiv.org 的科学论文中被提及的次数位居第二。Keras 还被大型科学组织的研究人员采用,特别是 CERN 和 NASA。</p> <hr /><h2 id="keras-可以轻松将模型转化为产品-3">Keras 可以轻松将模型转化为产品</h2> <p>与任何其他深度学习框架相比,你的 Keras 模型可以在更广泛的平台上轻松部署:</p> <ul><li>在 iOS 上,通过 Apple’s CoreML(苹果为 Keras 提供官方支持)。这里有一个教程。</li> <li>在 Android 上,通过 TensorFlow Android runtime,例如:Not Hotdog app。</li> <li>在浏览器中,通过 GPU 加速的 JavaScript 运行时,例如:Keras.js 和 WebDNN。</li> <li>在 Google Cloud 上,通过 TensorFlow-Serving。</li> <li>在 Python webapp 后端(比如 Flask app)中。</li> <li>在 JVM 上,通过 SkyMind 提供的 DL4J 模型导入。</li> <li>在 Raspberry Pi 树莓派上。</li> </ul><hr /><h2 id="keras-支持多个后端引擎,不会将你锁定到一个生态系统中-3">Keras 支持多个后端引擎,不会将你锁定到一个生态系统中</h2> <p>你的 Keras 模型可以基于不同的深度学习后端开发。重要的是,任何仅利用内置层构建的 Keras 模型,都可以在所有这些后端中移植:你可以用一种后端训练模型,再将它载入另一种后端中(例如为了发布的需要)。支持的后端有:</p> <ul><li>谷歌的 TensorFlow 后端</li> <li>微软的 CNTK 后端</li> <li>Theano 后端</li> </ul><p>亚马逊也正在为 Keras 开发 MXNet 后端。</p> <p>如此一来,你的 Keras 模型可以在 CPU 之外的不同硬件平台上训练:</p> <ul><li>NVIDIA GPU</li> <li>Google TPU,通过 TensorFlow 后端和 Google Cloud</li> <li>OpenCL 支持的 GPU, 比如 AMD, 通过 PlaidML Keras 后端</li> </ul><hr /><h2 id="keras-拥有强大的多-gpu-和分布式训练支持-3">Keras 拥有强大的多 GPU 和分布式训练支持</h2> <ul><li>Keras 内置对多 GPU 数据并行的支持。</li> <li>优步的 Horovod 对 Keras 模型拥有一流的支持。</li> <li>Keras 模型可以被转换为 TensorFlow Estimators 并在 Google Cloud 的 GPU 集群上训练。</li> <li>Keras 可以在 Spark(通过 CERN 的 Dist-Keras)和 Elephas 上运行。</li> </ul><hr /><h2 id="keras-的发展得到深度学习生态系统中的关键公司的支持-3">Keras 的发展得到深度学习生态系统中的关键公司的支持</h2> <p>Keras 的开发主要由谷歌支持,Keras API 以 tf.keras 的形式包装在 TensorFlow 中。此外,微软维护着 Keras 的 CNTK 后端。亚马逊 AWS 正在开发 MXNet 支持。其他提供支持的公司包括 NVIDIA、优步、苹果(通过 CoreML)等。</p> <p></p><p></p><img class="b-lazy" data-src="https://www.eimg.top/images/2020/04/08/4dc910a5cc48901e3f0435cc52766fa6.jpg" data-original="https://www.eimg.top/images/2020/04/08/4dc910a5cc48901e3f0435cc52766fa6.jpg" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><p></p> <p></p><p></p><img class="b-lazy" data-src="https://www.eimg.top/images/2020/04/08/83d810cf99f47ba0746ddf252a878abd.jpg" data-original="https://www.eimg.top/images/2020/04/08/83d810cf99f47ba0746ddf252a878abd.jpg" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><p></p> <p></p><p></p><img class="b-lazy" data-src="https://www.eimg.top/images/2020/04/08/d28bef9b7b0f6db92b9bb56b34dd120b.jpg" data-original="https://www.eimg.top/images/2020/04/08/d28bef9b7b0f6db92b9bb56b34dd120b.jpg" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><p></p> <p></p><p></p><img class="b-lazy" data-src="https://www.eimg.top/images/2020/04/08/c1eecb0a5b906f2e778da57626df64c0.jpg" data-original="https://www.eimg.top/images/2020/04/08/c1eecb0a5b906f2e778da57626df64c0.jpg" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><p></p>感谢作者分享-<a href="http://bjbsair.com/2020-04-07/tech-info/30656.html" rel="nofollow">http://bjbsair.com/2020-04-07/tech-info/30656.html</a> <p>===</p> <p></p><p></p><img class="b-lazy" data-src="https://www.eimg.top/images/2020/04/08/7e9c2c98189ed01734b98cf8ce22691d.jpg" data-original="https://www.eimg.top/images/2020/04/08/7e9c2c98189ed01734b98cf8ce22691d.jpg" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><p></p> <h2 id="你恰好发现了-keras。-4">你恰好发现了 Keras。</h2> <p>Keras 是一个用 Python 编写的高级神经网络 API,它能够以 TensorFlow, CNTK, 或者 Theano 作为后端运行。Keras 的开发重点是支持快速的实验。能够以最小的时延把你的想法转换为实验结果,是做好研究的关键。</p> <p>如果你在以下情况下需要深度学习库,请使用 Keras:</p> <ul><li>允许简单而快速的原型设计(由于用户友好,高度模块化,可扩展性)。</li> <li>同时支持卷积神经网络和循环神经网络,以及两者的组合。</li> <li>在 CPU 和 GPU 上无缝运行。</li> </ul><p>查看文档,请访问 Keras.io。</p> <p>Keras 兼容的 Python 版本: <strong>Python 2.7-3.6</strong>。</p> <hr /><h2 id="指导原则-4">指导原则</h2> <ul><li><strong>用户友好。</strong> Keras 是为人类而不是为机器设计的 API。它把用户体验放在首要和中心位置。Keras 遵循减少认知困难的最佳实践:它提供一致且简单的 API,将常见用例所需的用户操作数量降至最低,并且在用户错误时提供清晰和可操作的反馈。</li> <li><strong>模块化。</strong> 模型被理解为由独立的、完全可配置的模块构成的序列或图。这些模块可以以尽可能少的限制组装在一起。特别是神经网络层、损失函数、优化器、初始化方法、激活函数、正则化方法,它们都是可以结合起来构建新模型的模块。</li> <li><strong>易扩展性。</strong> 新的模块是很容易添加的(作为新的类和函数),现有的模块已经提供了充足的示例。由于能够轻松地创建可以提高表现力的新模块,Keras 更加适合高级研究。</li> <li><strong>基于 Python 实现。</strong> Keras 没有特定格式的单独配置文件。模型定义在 Python 代码中,这些代码紧凑,易于调试,并且易于扩展。</li> </ul><hr /><h2 id="快速开始:30-秒上手-keras-4">快速开始:30 秒上手 Keras</h2> <p>Keras 的核心数据结构是 <strong>model</strong>,一种组织网络层的方式。最简单的模型是 Sequential 顺序模型,它由多个网络层线性堆叠。对于更复杂的结构,你应该使用 Keras 函数式 API,它允许构建任意的神经网络图。</p> <p>Sequential 模型如下所示:</p> <pre>from keras.models import Sequential model = Sequential() </pre> <p>可以简单地使用 .add() 来堆叠模型:</p> <pre>from keras.layers import Dense model.add(Dense(units=64, activation='relu', input_dim=100)) model.add(Dense(units=10, activation='softmax')) </pre> <p>在完成了模型的构建后, 可以使用 .compile() 来配置学习过程:</p> <pre>model.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy']) </pre> <p>如果需要,你还可以进一步地配置你的优化器。Keras 的核心原则是使事情变得相当简单,同时又允许用户在需要的时候能够进行完全的控制(终极的控制是源代码的易扩展性)。</p> <pre>model.compile(loss=keras.losses.categorical_crossentropy, optimizer=keras.optimizers.SGD(lr=0.01, momentum=0.9, nesterov=True)) </pre> <p>现在,你可以批量地在训练数据上进行迭代了:</p> <pre># x_train 和 y_train 是 Numpy 数组 -- 就像在 Scikit-Learn API 中一样。 model.fit(x_train, y_train, epochs=5, batch_size=32) </pre> <p>或者,你可以手动地将批次的数据提供给模型:</p> <pre>model.train_on_batch(x_batch, y_batch) </pre> <p>只需一行代码就能评估模型性能:</p> <pre>loss_and_metrics = model.evaluate(x_test, y_test, batch_size=128) </pre> <p>或者对新的数据生成预测:</p> <pre>classes = model.predict(x_test, batch_size=128) </pre> <p>构建一个问答系统,一个图像分类模型,一个神经图灵机,或者其他的任何模型,就是这么的快。深度学习背后的思想很简单,那么它们的实现又何必要那么痛苦呢?</p> <p>有关 Keras 更深入的教程,请查看:</p> <ul><li>开始使用 Sequential 模型</li> <li>开始使用函数式 API</li> </ul><p>在代码仓库的 examples 目录中,你会找到更多高级模型:基于记忆网络的问答系统、基于栈式 LSTM 的文本生成等等。</p> <hr /><h2 id="安装指引-4">安装指引</h2> <p>在安装 Keras 之前,请安装以下后端引擎之一:TensorFlow,Theano,或者 CNTK。我们推荐 TensorFlow 后端。</p> <ul><li>TensorFlow 安装指引。</li> <li>Theano 安装指引。</li> <li>CNTK 安装指引。</li> </ul><p>你也可以考虑安装以下<strong>可选依赖</strong>:</p> <ul><li>cuDNN (如果你计划在 GPU 上运行 Keras,建议安装)。</li> <li>HDF5 和 h5py (如果你需要将 Keras 模型保存到磁盘,则需要这些)。</li> <li>graphviz 和 pydot (用于可视化工具绘制模型图)。</li> </ul><p>然后你就可以安装 Keras 本身了。有两种方法安装 Keras:</p> <ul><li><strong>使用 PyPI 安装 Keras (推荐):</strong></li> </ul><pre>sudo pip install keras </pre> <p>如果你使用 virtualenv 虚拟环境, 你可以避免使用 sudo:</p> <pre>pip install keras </pre> <ul><li><strong>或者:使用 GitHub 源码安装 Keras:</strong></li> </ul><p>首先,使用 git 来克隆 Keras:</p> <pre>git clone https://github.com/keras-team/keras.git </pre> <p>然后,cd 到 Keras 目录并且运行安装命令:</p> <pre>cd keras sudo python setup.py install </pre> <hr /><h2 id="配置你的-keras-后端-4">配置你的 Keras 后端</h2> <p>默认情况下,Keras 将使用 TensorFlow 作为其张量操作库。请跟随这些指引来配置其他 Keras 后端。</p> <hr /><h2 id="技术支持-4">技术支持</h2> <p>你可以提出问题并参与开发讨论:</p> <ul><li>Keras Google group。</li> <li>Keras Slack channel。 使用 这个链接 向该频道请求邀请函。</li> </ul><p>你也可以在 GitHub issues 中发布<strong>漏洞报告和新功能请求</strong>(仅限于此)。注意请先阅读规范文档。</p> <hr /><h2 id="为什么取名为-keras-4">为什么取名为 Keras?</h2> <p>Keras (κέρας) 在希腊语中意为 号角 。它来自古希腊和拉丁文学中的一个文学形象,首先出现于 《奥德赛》 中, 梦神 (Oneiroi, singular Oneiros) 从这两类人中分离出来:那些用虚幻的景象欺骗人类,通过象牙之门抵达地球之人,以及那些宣告未来即将到来,通过号角之门抵达之人。 它类似于文字寓意,κέρας (号角) / κραίνω (履行),以及 ἐλέφας (象牙) / ἐλεφαίρομαι (欺骗)。</p> <p>Keras 最初是作为 ONEIROS 项目(开放式神经电子智能机器人操作系统)研究工作的一部分而开发的。</p> <blockquote> <p>"Oneiroi 超出了我们的理解 - 谁能确定它们讲述了什么故事?并不是所有人都能找到。那里有两扇门,就是通往短暂的 Oneiroi 的通道;一个是用号角制造的,一个是用象牙制造的。穿过尖锐的象牙的 Oneiroi 是诡计多端的,他们带有一些不会实现的信息; 那些穿过抛光的喇叭出来的人背后具有真理,对于看到他们的人来说是完成的。" Homer, Odyssey 19. 562 ff (Shewring translation).</p> </blockquote> <h1 id="为什么选择-keras?-4">为什么选择 Keras?</h1> <p>在如今无数深度学习框架中,为什么要使用 Keras 而非其他?以下是 Keras 与现有替代品的一些比较。</p> <hr /><h2 id="keras-优先考虑开发人员的经验-4">Keras 优先考虑开发人员的经验</h2> <ul><li>Keras 是为人类而非机器设计的 API。Keras 遵循减少认知困难的最佳实践: 它提供一致且简单的 API,它将常见用例所需的用户操作数量降至最低,并且在用户错误时提供清晰和可操作的反馈。</li> <li>这使 Keras 易于学习和使用。作为 Keras 用户,你的工作效率更高,能够比竞争对手更快地尝试更多创意,从而帮助你赢得机器学习竞赛。</li> <li>这种易用性并不以降低灵活性为代价:因为 Keras 与底层深度学习语言(特别是 TensorFlow)集成在一起,所以它可以让你实现任何你可以用基础语言编写的东西。特别是,tf.keras 作为 Keras API 可以与 TensorFlow 工作流无缝集成。</li> </ul><hr /><h2 id="keras-被工业界和学术界广泛采用-4">Keras 被工业界和学术界广泛采用</h2> <p></p><p></p><img class="b-lazy" data-src="https://www.eimg.top/images/2020/04/08/93297358baea098c3f069c0476016f2d.jpg" data-original="https://www.eimg.top/images/2020/04/08/93297358baea098c3f069c0476016f2d.jpg" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><p></p> <p>Deep learning 框架排名,由 Jeff Hale 基于 7 个分类的 11 个数据源计算得出</p> <p>截至 2018 年中期,Keras 拥有超过 250,000 名个人用户。与其他任何深度学习框架相比,Keras 在行业和研究领域的应用率更高(除 TensorFlow 之外,且 Keras API 是 TensorFlow 的官方前端,通过 tf.keras 模块使用)。</p> <p>您已经不断与使用 Keras 构建的功能进行交互 - 它在 Netflix, Uber, Yelp, Instacart, Zocdoc, Square 等众多网站上使用。它尤其受以深度学习作为产品核心的创业公司的欢迎。</p> <p>Keras也是深度学习研究人员的最爱,在上载到预印本服务器 arXiv.org 的科学论文中被提及的次数位居第二。Keras 还被大型科学组织的研究人员采用,特别是 CERN 和 NASA。</p> <hr /><h2 id="keras-可以轻松将模型转化为产品-4">Keras 可以轻松将模型转化为产品</h2> <p>与任何其他深度学习框架相比,你的 Keras 模型可以在更广泛的平台上轻松部署:</p> <ul><li>在 iOS 上,通过 Apple’s CoreML(苹果为 Keras 提供官方支持)。这里有一个教程。</li> <li>在 Android 上,通过 TensorFlow Android runtime,例如:Not Hotdog app。</li> <li>在浏览器中,通过 GPU 加速的 JavaScript 运行时,例如:Keras.js 和 WebDNN。</li> <li>在 Google Cloud 上,通过 TensorFlow-Serving。</li> <li>在 Python webapp 后端(比如 Flask app)中。</li> <li>在 JVM 上,通过 SkyMind 提供的 DL4J 模型导入。</li> <li>在 Raspberry Pi 树莓派上。</li> </ul><hr /><h2 id="keras-支持多个后端引擎,不会将你锁定到一个生态系统中-4">Keras 支持多个后端引擎,不会将你锁定到一个生态系统中</h2> <p>你的 Keras 模型可以基于不同的深度学习后端开发。重要的是,任何仅利用内置层构建的 Keras 模型,都可以在所有这些后端中移植:你可以用一种后端训练模型,再将它载入另一种后端中(例如为了发布的需要)。支持的后端有:</p> <ul><li>谷歌的 TensorFlow 后端</li> <li>微软的 CNTK 后端</li> <li>Theano 后端</li> </ul><p>亚马逊也正在为 Keras 开发 MXNet 后端。</p> <p>如此一来,你的 Keras 模型可以在 CPU 之外的不同硬件平台上训练:</p> <ul><li>NVIDIA GPU</li> <li>Google TPU,通过 TensorFlow 后端和 Google Cloud</li> <li>OpenCL 支持的 GPU, 比如 AMD, 通过 PlaidML Keras 后端</li> </ul><hr /><h2 id="keras-拥有强大的多-gpu-和分布式训练支持-4">Keras 拥有强大的多 GPU 和分布式训练支持</h2> <ul><li>Keras 内置对多 GPU 数据并行的支持。</li> <li>优步的 Horovod 对 Keras 模型拥有一流的支持。</li> <li>Keras 模型可以被转换为 TensorFlow Estimators 并在 Google Cloud 的 GPU 集群上训练。</li> <li>Keras 可以在 Spark(通过 CERN 的 Dist-Keras)和 Elephas 上运行。</li> </ul><hr /><h2 id="keras-的发展得到深度学习生态系统中的关键公司的支持-4">Keras 的发展得到深度学习生态系统中的关键公司的支持</h2> <p>Keras 的开发主要由谷歌支持,Keras API 以 tf.keras 的形式包装在 TensorFlow 中。此外,微软维护着 Keras 的 CNTK 后端。亚马逊 AWS 正在开发 MXNet 支持。其他提供支持的公司包括 NVIDIA、优步、苹果(通过 CoreML)等。</p> <p></p><p></p><img class="b-lazy" data-src="https://www.eimg.top/images/2020/04/08/e13339b1ea72ef3b396d16c4f54aa130.jpg" data-original="https://www.eimg.top/images/2020/04/08/e13339b1ea72ef3b396d16c4f54aa130.jpg" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><p></p> <p></p><p></p><img class="b-lazy" data-src="https://www.eimg.top/images/2020/04/08/e2adc0e2884a778435e61219b79789d0.jpg" data-original="https://www.eimg.top/images/2020/04/08/e2adc0e2884a778435e61219b79789d0.jpg" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><p></p> <p></p><p></p><img class="b-lazy" data-src="https://www.eimg.top/images/2020/04/08/abb53599403315cc30fa2542d6cfa632.jpg" data-original="https://www.eimg.top/images/2020/04/08/abb53599403315cc30fa2542d6cfa632.jpg" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><p></p> <p></p><p></p><img class="b-lazy" data-src="https://www.eimg.top/images/2020/04/08/1d833746c687f81a58e39389777838a7.jpg" data-original="https://www.eimg.top/images/2020/04/08/1d833746c687f81a58e39389777838a7.jpg" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><p></p>感谢作者分享-<a href="http://bjbsair.com/2020-04-07/tech-info/30656.html" rel="nofollow">http://bjbsair.com/2020-04-07/tech-info/30656.html</a> <p>===</p> <p></p><p></p><img class="b-lazy" data-src="https://www.eimg.top/images/2020/04/08/90ef1b94349144aa5cfc9f06d935d652.jpg" data-original="https://www.eimg.top/images/2020/04/08/90ef1b94349144aa5cfc9f06d935d652.jpg" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><p></p> <h2 id="你恰好发现了-keras。-5">你恰好发现了 Keras。</h2> <p>Keras 是一个用 Python 编写的高级神经网络 API,它能够以 TensorFlow, CNTK, 或者 Theano 作为后端运行。Keras 的开发重点是支持快速的实验。能够以最小的时延把你的想法转换为实验结果,是做好研究的关键。</p> <p>如果你在以下情况下需要深度学习库,请使用 Keras:</p> <ul><li>允许简单而快速的原型设计(由于用户友好,高度模块化,可扩展性)。</li> <li>同时支持卷积神经网络和循环神经网络,以及两者的组合。</li> <li>在 CPU 和 GPU 上无缝运行。</li> </ul><p>查看文档,请访问 Keras.io。</p> <p>Keras 兼容的 Python 版本: <strong>Python 2.7-3.6</strong>。</p> <hr /><h2 id="指导原则-5">指导原则</h2> <ul><li><strong>用户友好。</strong> Keras 是为人类而不是为机器设计的 API。它把用户体验放在首要和中心位置。Keras 遵循减少认知困难的最佳实践:它提供一致且简单的 API,将常见用例所需的用户操作数量降至最低,并且在用户错误时提供清晰和可操作的反馈。</li> <li><strong>模块化。</strong> 模型被理解为由独立的、完全可配置的模块构成的序列或图。这些模块可以以尽可能少的限制组装在一起。特别是神经网络层、损失函数、优化器、初始化方法、激活函数、正则化方法,它们都是可以结合起来构建新模型的模块。</li> <li><strong>易扩展性。</strong> 新的模块是很容易添加的(作为新的类和函数),现有的模块已经提供了充足的示例。由于能够轻松地创建可以提高表现力的新模块,Keras 更加适合高级研究。</li> <li><strong>基于 Python 实现。</strong> Keras 没有特定格式的单独配置文件。模型定义在 Python 代码中,这些代码紧凑,易于调试,并且易于扩展。</li> </ul><hr /><h2 id="快速开始:30-秒上手-keras-5">快速开始:30 秒上手 Keras</h2> <p>Keras 的核心数据结构是 <strong>model</strong>,一种组织网络层的方式。最简单的模型是 Sequential 顺序模型,它由多个网络层线性堆叠。对于更复杂的结构,你应该使用 Keras 函数式 API,它允许构建任意的神经网络图。</p> <p>Sequential 模型如下所示:</p> <pre>from keras.models import Sequential model = Sequential() </pre> <p>可以简单地使用 .add() 来堆叠模型:</p> <pre>from keras.layers import Dense model.add(Dense(units=64, activation='relu', input_dim=100)) model.add(Dense(units=10, activation='softmax')) </pre> <p>在完成了模型的构建后, 可以使用 .compile() 来配置学习过程:</p> <pre>model.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy']) </pre> <p>如果需要,你还可以进一步地配置你的优化器。Keras 的核心原则是使事情变得相当简单,同时又允许用户在需要的时候能够进行完全的控制(终极的控制是源代码的易扩展性)。</p> <pre>model.compile(loss=keras.losses.categorical_crossentropy, optimizer=keras.optimizers.SGD(lr=0.01, momentum=0.9, nesterov=True)) </pre> <p>现在,你可以批量地在训练数据上进行迭代了:</p> <pre># x_train 和 y_train 是 Numpy 数组 -- 就像在 Scikit-Learn API 中一样。 model.fit(x_train, y_train, epochs=5, batch_size=32) </pre> <p>或者,你可以手动地将批次的数据提供给模型:</p> <pre>model.train_on_batch(x_batch, y_batch) </pre> <p>只需一行代码就能评估模型性能:</p> <pre>loss_and_metrics = model.evaluate(x_test, y_test, batch_size=128) </pre> <p>或者对新的数据生成预测:</p> <pre>classes = model.predict(x_test, batch_size=128) </pre> <p>构建一个问答系统,一个图像分类模型,一个神经图灵机,或者其他的任何模型,就是这么的快。深度学习背后的思想很简单,那么它们的实现又何必要那么痛苦呢?</p> <p>有关 Keras 更深入的教程,请查看:</p> <ul><li>开始使用 Sequential 模型</li> <li>开始使用函数式 API</li> </ul><p>在代码仓库的 examples 目录中,你会找到更多高级模型:基于记忆网络的问答系统、基于栈式 LSTM 的文本生成等等。</p> <hr /><h2 id="安装指引-5">安装指引</h2> <p>在安装 Keras 之前,请安装以下后端引擎之一:TensorFlow,Theano,或者 CNTK。我们推荐 TensorFlow 后端。</p> <ul><li>TensorFlow 安装指引。</li> <li>Theano 安装指引。</li> <li>CNTK 安装指引。</li> </ul><p>你也可以考虑安装以下<strong>可选依赖</strong>:</p> <ul><li>cuDNN (如果你计划在 GPU 上运行 Keras,建议安装)。</li> <li>HDF5 和 h5py (如果你需要将 Keras 模型保存到磁盘,则需要这些)。</li> <li>graphviz 和 pydot (用于可视化工具绘制模型图)。</li> </ul><p>然后你就可以安装 Keras 本身了。有两种方法安装 Keras:</p> <ul><li><strong>使用 PyPI 安装 Keras (推荐):</strong></li> </ul><pre>sudo pip install keras </pre> <p>如果你使用 virtualenv 虚拟环境, 你可以避免使用 sudo:</p> <pre>pip install keras </pre> <ul><li><strong>或者:使用 GitHub 源码安装 Keras:</strong></li> </ul><p>首先,使用 git 来克隆 Keras:</p> <pre>git clone https://github.com/keras-team/keras.git </pre> <p>然后,cd 到 Keras 目录并且运行安装命令:</p> <pre>cd keras sudo python setup.py install </pre> <hr /><h2 id="配置你的-keras-后端-5">配置你的 Keras 后端</h2> <p>默认情况下,Keras 将使用 TensorFlow 作为其张量操作库。请跟随这些指引来配置其他 Keras 后端。</p> <hr /><h2 id="技术支持-5">技术支持</h2> <p>你可以提出问题并参与开发讨论:</p> <ul><li>Keras Google group。</li> <li>Keras Slack channel。 使用 这个链接 向该频道请求邀请函。</li> </ul><p>你也可以在 GitHub issues 中发布<strong>漏洞报告和新功能请求</strong>(仅限于此)。注意请先阅读规范文档。</p> <hr /><h2 id="为什么取名为-keras-5">为什么取名为 Keras?</h2> <p>Keras (κέρας) 在希腊语中意为 号角 。它来自古希腊和拉丁文学中的一个文学形象,首先出现于 《奥德赛》 中, 梦神 (Oneiroi, singular Oneiros) 从这两类人中分离出来:那些用虚幻的景象欺骗人类,通过象牙之门抵达地球之人,以及那些宣告未来即将到来,通过号角之门抵达之人。 它类似于文字寓意,κέρας (号角) / κραίνω (履行),以及 ἐλέφας (象牙) / ἐλεφαίρομαι (欺骗)。</p> <p>Keras 最初是作为 ONEIROS 项目(开放式神经电子智能机器人操作系统)研究工作的一部分而开发的。</p> <blockquote> <p>"Oneiroi 超出了我们的理解 - 谁能确定它们讲述了什么故事?并不是所有人都能找到。那里有两扇门,就是通往短暂的 Oneiroi 的通道;一个是用号角制造的,一个是用象牙制造的。穿过尖锐的象牙的 Oneiroi 是诡计多端的,他们带有一些不会实现的信息; 那些穿过抛光的喇叭出来的人背后具有真理,对于看到他们的人来说是完成的。" Homer, Odyssey 19. 562 ff (Shewring translation).</p> </blockquote> <h1 id="为什么选择-keras?-5">为什么选择 Keras?</h1> <p>在如今无数深度学习框架中,为什么要使用 Keras 而非其他?以下是 Keras 与现有替代品的一些比较。</p> <hr /><h2 id="keras-优先考虑开发人员的经验-5">Keras 优先考虑开发人员的经验</h2> <ul><li>Keras 是为人类而非机器设计的 API。Keras 遵循减少认知困难的最佳实践: 它提供一致且简单的 API,它将常见用例所需的用户操作数量降至最低,并且在用户错误时提供清晰和可操作的反馈。</li> <li>这使 Keras 易于学习和使用。作为 Keras 用户,你的工作效率更高,能够比竞争对手更快地尝试更多创意,从而帮助你赢得机器学习竞赛。</li> <li>这种易用性并不以降低灵活性为代价:因为 Keras 与底层深度学习语言(特别是 TensorFlow)集成在一起,所以它可以让你实现任何你可以用基础语言编写的东西。特别是,tf.keras 作为 Keras API 可以与 TensorFlow 工作流无缝集成。</li> </ul><hr /><h2 id="keras-被工业界和学术界广泛采用-5">Keras 被工业界和学术界广泛采用</h2> <p></p><p></p><img class="b-lazy" data-src="https://www.eimg.top/images/2020/04/08/2caf506768581891148ad691cdbdb700.jpg" data-original="https://www.eimg.top/images/2020/04/08/2caf506768581891148ad691cdbdb700.jpg" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><p></p> <p>Deep learning 框架排名,由 Jeff Hale 基于 7 个分类的 11 个数据源计算得出</p> <p>截至 2018 年中期,Keras 拥有超过 250,000 名个人用户。与其他任何深度学习框架相比,Keras 在行业和研究领域的应用率更高(除 TensorFlow 之外,且 Keras API 是 TensorFlow 的官方前端,通过 tf.keras 模块使用)。</p> <p>您已经不断与使用 Keras 构建的功能进行交互 - 它在 Netflix, Uber, Yelp, Instacart, Zocdoc, Square 等众多网站上使用。它尤其受以深度学习作为产品核心的创业公司的欢迎。</p> <p>Keras也是深度学习研究人员的最爱,在上载到预印本服务器 arXiv.org 的科学论文中被提及的次数位居第二。Keras 还被大型科学组织的研究人员采用,特别是 CERN 和 NASA。</p> <hr /><h2 id="keras-可以轻松将模型转化为产品-5">Keras 可以轻松将模型转化为产品</h2> <p>与任何其他深度学习框架相比,你的 Keras 模型可以在更广泛的平台上轻松部署:</p> <ul><li>在 iOS 上,通过 Apple’s CoreML(苹果为 Keras 提供官方支持)。这里有一个教程。</li> <li>在 Android 上,通过 TensorFlow Android runtime,例如:Not Hotdog app。</li> <li>在浏览器中,通过 GPU 加速的 JavaScript 运行时,例如:Keras.js 和 WebDNN。</li> <li>在 Google Cloud 上,通过 TensorFlow-Serving。</li> <li>在 Python webapp 后端(比如 Flask app)中。</li> <li>在 JVM 上,通过 SkyMind 提供的 DL4J 模型导入。</li> <li>在 Raspberry Pi 树莓派上。</li> </ul><hr /><h2 id="keras-支持多个后端引擎,不会将你锁定到一个生态系统中-5">Keras 支持多个后端引擎,不会将你锁定到一个生态系统中</h2> <p>你的 Keras 模型可以基于不同的深度学习后端开发。重要的是,任何仅利用内置层构建的 Keras 模型,都可以在所有这些后端中移植:你可以用一种后端训练模型,再将它载入另一种后端中(例如为了发布的需要)。支持的后端有:</p> <ul><li>谷歌的 TensorFlow 后端</li> <li>微软的 CNTK 后端</li> <li>Theano 后端</li> </ul><p>亚马逊也正在为 Keras 开发 MXNet 后端。</p> <p>如此一来,你的 Keras 模型可以在 CPU 之外的不同硬件平台上训练:</p> <ul><li>NVIDIA GPU</li> <li>Google TPU,通过 TensorFlow 后端和 Google Cloud</li> <li>OpenCL 支持的 GPU, 比如 AMD, 通过 PlaidML Keras 后端</li> </ul><hr /><h2 id="keras-拥有强大的多-gpu-和分布式训练支持-5">Keras 拥有强大的多 GPU 和分布式训练支持</h2> <ul><li>Keras 内置对多 GPU 数据并行的支持。</li> <li>优步的 Horovod 对 Keras 模型拥有一流的支持。</li> <li>Keras 模型可以被转换为 TensorFlow Estimators 并在 Google Cloud 的 GPU 集群上训练。</li> <li>Keras 可以在 Spark(通过 CERN 的 Dist-Keras)和 Elephas 上运行。</li> </ul><hr /><h2 id="keras-的发展得到深度学习生态系统中的关键公司的支持-5">Keras 的发展得到深度学习生态系统中的关键公司的支持</h2> <p>Keras 的开发主要由谷歌支持,Keras API 以 tf.keras 的形式包装在 TensorFlow 中。此外,微软维护着 Keras 的 CNTK 后端。亚马逊 AWS 正在开发 MXNet 支持。其他提供支持的公司包括 NVIDIA、优步、苹果(通过 CoreML)等。</p> <p></p><p></p><img class="b-lazy" data-src="https://www.eimg.top/images/2020/04/08/e293b2cb6635123db90aef1dad3bd25d.jpg" data-original="https://www.eimg.top/images/2020/04/08/e293b2cb6635123db90aef1dad3bd25d.jpg" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><p></p> <p></p><p></p><img class="b-lazy" data-src="https://www.eimg.top/images/2020/04/08/5fd8897f9f9bb383708006e9596ea8cf.jpg" data-original="https://www.eimg.top/images/2020/04/08/5fd8897f9f9bb383708006e9596ea8cf.jpg" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><p></p> <p></p><p></p><img class="b-lazy" data-src="https://www.eimg.top/images/2020/04/08/07453e2a66da1c6eedd0a8eef72d8a3f.jpg" data-original="https://www.eimg.top/images/2020/04/08/07453e2a66da1c6eedd0a8eef72d8a3f.jpg" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><p></p> <p></p><p></p><img class="b-lazy" data-src="https://www.eimg.top/images/2020/04/08/a0655003c550dbd406cbe8909748926a.jpg" data-original="https://www.eimg.top/images/2020/04/08/a0655003c550dbd406cbe8909748926a.jpg" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><p></p>感谢作者分享-<a href="http://bjbsair.com/2020-04-07/tech-info/30656.html" rel="nofollow">http://bjbsair.com/2020-04-07/tech-info/30656.html</a> <p>===</p> <p></p><p></p><img class="b-lazy" data-src="https://www.eimg.top/images/2020/04/08/111b37fe1364eade71c81950b0680030.jpg" data-original="https://www.eimg.top/images/2020/04/08/111b37fe1364eade71c81950b0680030.jpg" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><p></p> <h2 id="你恰好发现了-keras。-6">你恰好发现了 Keras。</h2> <p>Keras 是一个用 Python 编写的高级神经网络 API,它能够以 TensorFlow, CNTK, 或者 Theano 作为后端运行。Keras 的开发重点是支持快速的实验。能够以最小的时延把你的想法转换为实验结果,是做好研究的关键。</p> <p>如果你在以下情况下需要深度学习库,请使用 Keras:</p> <ul><li>允许简单而快速的原型设计(由于用户友好,高度模块化,可扩展性)。</li> <li>同时支持卷积神经网络和循环神经网络,以及两者的组合。</li> <li>在 CPU 和 GPU 上无缝运行。</li> </ul><p>查看文档,请访问 Keras.io。</p> <p>Keras 兼容的 Python 版本: <strong>Python 2.7-3.6</strong>。</p> <hr /><h2 id="指导原则-6">指导原则</h2> <ul><li><strong>用户友好。</strong> Keras 是为人类而不是为机器设计的 API。它把用户体验放在首要和中心位置。Keras 遵循减少认知困难的最佳实践:它提供一致且简单的 API,将常见用例所需的用户操作数量降至最低,并且在用户错误时提供清晰和可操作的反馈。</li> <li><strong>模块化。</strong> 模型被理解为由独立的、完全可配置的模块构成的序列或图。这些模块可以以尽可能少的限制组装在一起。特别是神经网络层、损失函数、优化器、初始化方法、激活函数、正则化方法,它们都是可以结合起来构建新模型的模块。</li> <li><strong>易扩展性。</strong> 新的模块是很容易添加的(作为新的类和函数),现有的模块已经提供了充足的示例。由于能够轻松地创建可以提高表现力的新模块,Keras 更加适合高级研究。</li> <li><strong>基于 Python 实现。</strong> Keras 没有特定格式的单独配置文件。模型定义在 Python 代码中,这些代码紧凑,易于调试,并且易于扩展。</li> </ul><hr /><h2 id="快速开始:30-秒上手-keras-6">快速开始:30 秒上手 Keras</h2> <p>Keras 的核心数据结构是 <strong>model</strong>,一种组织网络层的方式。最简单的模型是 Sequential 顺序模型,它由多个网络层线性堆叠。对于更复杂的结构,你应该使用 Keras 函数式 API,它允许构建任意的神经网络图。</p> <p>Sequential 模型如下所示:</p> <pre>from keras.models import Sequential model = Sequential() </pre> <p>可以简单地使用 .add() 来堆叠模型:</p> <pre>from keras.layers import Dense model.add(Dense(units=64, activation='relu', input_dim=100)) model.add(Dense(units=10, activation='softmax')) </pre> <p>在完成了模型的构建后, 可以使用 .compile() 来配置学习过程:</p> <pre>model.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy']) </pre> <p>如果需要,你还可以进一步地配置你的优化器。Keras 的核心原则是使事情变得相当简单,同时又允许用户在需要的时候能够进行完全的控制(终极的控制是源代码的易扩展性)。</p> <pre>model.compile(loss=keras.losses.categorical_crossentropy, optimizer=keras.optimizers.SGD(lr=0.01, momentum=0.9, nesterov=True)) </pre> <p>现在,你可以批量地在训练数据上进行迭代了:</p> <pre># x_train 和 y_train 是 Numpy 数组 -- 就像在 Scikit-Learn API 中一样。 model.fit(x_train, y_train, epochs=5, batch_size=32) </pre> <p>或者,你可以手动地将批次的数据提供给模型:</p> <pre>model.train_on_batch(x_batch, y_batch) </pre> <p>只需一行代码就能评估模型性能:</p> <pre>loss_and_metrics = model.evaluate(x_test, y_test, batch_size=128) </pre> <p>或者对新的数据生成预测:</p> <pre>classes = model.predict(x_test, batch_size=128) </pre> <p>构建一个问答系统,一个图像分类模型,一个神经图灵机,或者其他的任何模型,就是这么的快。深度学习背后的思想很简单,那么它们的实现又何必要那么痛苦呢?</p> <p>有关 Keras 更深入的教程,请查看:</p> <ul><li>开始使用 Sequential 模型</li> <li>开始使用函数式 API</li> </ul><p>在代码仓库的 examples 目录中,你会找到更多高级模型:基于记忆网络的问答系统、基于栈式 LSTM 的文本生成等等。</p> <hr /><h2 id="安装指引-6">安装指引</h2> <p>在安装 Keras 之前,请安装以下后端引擎之一:TensorFlow,Theano,或者 CNTK。我们推荐 TensorFlow 后端。</p> <ul><li>TensorFlow 安装指引。</li> <li>Theano 安装指引。</li> <li>CNTK 安装指引。</li> </ul><p>你也可以考虑安装以下<strong>可选依赖</strong>:</p> <ul><li>cuDNN (如果你计划在 GPU 上运行 Keras,建议安装)。</li> <li>HDF5 和 h5py (如果你需要将 Keras 模型保存到磁盘,则需要这些)。</li> <li>graphviz 和 pydot (用于可视化工具绘制模型图)。</li> </ul><p>然后你就可以安装 Keras 本身了。有两种方法安装 Keras:</p> <ul><li><strong>使用 PyPI 安装 Keras (推荐):</strong></li> </ul><pre>sudo pip install keras </pre> <p>如果你使用 virtualenv 虚拟环境, 你可以避免使用 sudo:</p> <pre>pip install keras </pre> <ul><li><strong>或者:使用 GitHub 源码安装 Keras:</strong></li> </ul><p>首先,使用 git 来克隆 Keras:</p> <pre>git clone https://github.com/keras-team/keras.git </pre> <p>然后,cd 到 Keras 目录并且运行安装命令:</p> <pre>cd keras sudo python setup.py install </pre> <hr /><h2 id="配置你的-keras-后端-6">配置你的 Keras 后端</h2> <p>默认情况下,Keras 将使用 TensorFlow 作为其张量操作库。请跟随这些指引来配置其他 Keras 后端。</p> <hr /><h2 id="技术支持-6">技术支持</h2> <p>你可以提出问题并参与开发讨论:</p> <ul><li>Keras Google group。</li> <li>Keras Slack channel。 使用 这个链接 向该频道请求邀请函。</li> </ul><p>你也可以在 GitHub issues 中发布<strong>漏洞报告和新功能请求</strong>(仅限于此)。注意请先阅读规范文档。</p> <hr /><h2 id="为什么取名为-keras-6">为什么取名为 Keras?</h2> <p>Keras (κέρας) 在希腊语中意为 号角 。它来自古希腊和拉丁文学中的一个文学形象,首先出现于 《奥德赛》 中, 梦神 (Oneiroi, singular Oneiros) 从这两类人中分离出来:那些用虚幻的景象欺骗人类,通过象牙之门抵达地球之人,以及那些宣告未来即将到来,通过号角之门抵达之人。 它类似于文字寓意,κέρας (号角) / κραίνω (履行),以及 ἐλέφας (象牙) / ἐλεφαίρομαι (欺骗)。</p> <p>Keras 最初是作为 ONEIROS 项目(开放式神经电子智能机器人操作系统)研究工作的一部分而开发的。</p> <blockquote> <p>"Oneiroi 超出了我们的理解 - 谁能确定它们讲述了什么故事?并不是所有人都能找到。那里有两扇门,就是通往短暂的 Oneiroi 的通道;一个是用号角制造的,一个是用象牙制造的。穿过尖锐的象牙的 Oneiroi 是诡计多端的,他们带有一些不会实现的信息; 那些穿过抛光的喇叭出来的人背后具有真理,对于看到他们的人来说是完成的。" Homer, Odyssey 19. 562 ff (Shewring translation).</p> </blockquote> <h1 id="为什么选择-keras?-6">为什么选择 Keras?</h1> <p>在如今无数深度学习框架中,为什么要使用 Keras 而非其他?以下是 Keras 与现有替代品的一些比较。</p> <hr /><h2 id="keras-优先考虑开发人员的经验-6">Keras 优先考虑开发人员的经验</h2> <ul><li>Keras 是为人类而非机器设计的 API。Keras 遵循减少认知困难的最佳实践: 它提供一致且简单的 API,它将常见用例所需的用户操作数量降至最低,并且在用户错误时提供清晰和可操作的反馈。</li> <li>这使 Keras 易于学习和使用。作为 Keras 用户,你的工作效率更高,能够比竞争对手更快地尝试更多创意,从而帮助你赢得机器学习竞赛。</li> <li>这种易用性并不以降低灵活性为代价:因为 Keras 与底层深度学习语言(特别是 TensorFlow)集成在一起,所以它可以让你实现任何你可以用基础语言编写的东西。特别是,tf.keras 作为 Keras API 可以与 TensorFlow 工作流无缝集成。</li> </ul><hr /><h2 id="keras-被工业界和学术界广泛采用-6">Keras 被工业界和学术界广泛采用</h2> <p></p><p></p><img class="b-lazy" data-src="https://www.eimg.top/images/2020/04/08/b76527d01b0251e834fc6c6e870e7465.jpg" data-original="https://www.eimg.top/images/2020/04/08/b76527d01b0251e834fc6c6e870e7465.jpg" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><p></p> <p>Deep learning 框架排名,由 Jeff Hale 基于 7 个分类的 11 个数据源计算得出</p> <p>截至 2018 年中期,Keras 拥有超过 250,000 名个人用户。与其他任何深度学习框架相比,Keras 在行业和研究领域的应用率更高(除 TensorFlow 之外,且 Keras API 是 TensorFlow 的官方前端,通过 tf.keras 模块使用)。</p> <p>您已经不断与使用 Keras 构建的功能进行交互 - 它在 Netflix, Uber, Yelp, Instacart, Zocdoc, Square 等众多网站上使用。它尤其受以深度学习作为产品核心的创业公司的欢迎。</p> <p>Keras也是深度学习研究人员的最爱,在上载到预印本服务器 arXiv.org 的科学论文中被提及的次数位居第二。Keras 还被大型科学组织的研究人员采用,特别是 CERN 和 NASA。</p> <hr /><h2 id="keras-可以轻松将模型转化为产品-6">Keras 可以轻松将模型转化为产品</h2> <p>与任何其他深度学习框架相比,你的 Keras 模型可以在更广泛的平台上轻松部署:</p> <ul><li>在 iOS 上,通过 Apple’s CoreML(苹果为 Keras 提供官方支持)。这里有一个教程。</li> <li>在 Android 上,通过 TensorFlow Android runtime,例如:Not Hotdog app。</li> <li>在浏览器中,通过 GPU 加速的 JavaScript 运行时,例如:Keras.js 和 WebDNN。</li> <li>在 Google Cloud 上,通过 TensorFlow-Serving。</li> <li>在 Python webapp 后端(比如 Flask app)中。</li> <li>在 JVM 上,通过 SkyMind 提供的 DL4J 模型导入。</li> <li>在 Raspberry Pi 树莓派上。</li> </ul><hr /><h2 id="keras-支持多个后端引擎,不会将你锁定到一个生态系统中-6">Keras 支持多个后端引擎,不会将你锁定到一个生态系统中</h2> <p>你的 Keras 模型可以基于不同的深度学习后端开发。重要的是,任何仅利用内置层构建的 Keras 模型,都可以在所有这些后端中移植:你可以用一种后端训练模型,再将它载入另一种后端中(例如为了发布的需要)。支持的后端有:</p> <ul><li>谷歌的 TensorFlow 后端</li> <li>微软的 CNTK 后端</li> <li>Theano 后端</li> </ul><p>亚马逊也正在为 Keras 开发 MXNet 后端。</p> <p>如此一来,你的 Keras 模型可以在 CPU 之外的不同硬件平台上训练:</p> <ul><li>NVIDIA GPU</li> <li>Google TPU,通过 TensorFlow 后端和 Google Cloud</li> <li>OpenCL 支持的 GPU, 比如 AMD, 通过 PlaidML Keras 后端</li> </ul><hr /><h2 id="keras-拥有强大的多-gpu-和分布式训练支持-6">Keras 拥有强大的多 GPU 和分布式训练支持</h2> <ul><li>Keras 内置对多 GPU 数据并行的支持。</li> <li>优步的 Horovod 对 Keras 模型拥有一流的支持。</li> <li>Keras 模型可以被转换为 TensorFlow Estimators 并在 Google Cloud 的 GPU 集群上训练。</li> <li>Keras 可以在 Spark(通过 CERN 的 Dist-Keras)和 Elephas 上运行。</li> </ul><hr /><h2 id="keras-的发展得到深度学习生态系统中的关键公司的支持-6">Keras 的发展得到深度学习生态系统中的关键公司的支持</h2> <p>Keras 的开发主要由谷歌支持,Keras API 以 tf.keras 的形式包装在 TensorFlow 中。此外,微软维护着 Keras 的 CNTK 后端。亚马逊 AWS 正在开发 MXNet 支持。其他提供支持的公司包括 NVIDIA、优步、苹果(通过 CoreML)等。</p> <p></p><p></p><img class="b-lazy" data-src="https://www.eimg.top/images/2020/04/08/afd415eac29685b026b426b6848a1149.jpg" data-original="https://www.eimg.top/images/2020/04/08/afd415eac29685b026b426b6848a1149.jpg" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><p></p> <p></p><p></p><img class="b-lazy" data-src="https://www.eimg.top/images/2020/04/08/204bbcfaf927e90f563928fb6c230751.jpg" data-original="https://www.eimg.top/images/2020/04/08/204bbcfaf927e90f563928fb6c230751.jpg" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><p></p> <p></p><p></p><img class="b-lazy" data-src="https://www.eimg.top/images/2020/04/08/51bc123ba90b85862bc87eca2f91814c.jpg" data-original="https://www.eimg.top/images/2020/04/08/51bc123ba90b85862bc87eca2f91814c.jpg" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><p></p> <p></p><p></p><img class="b-lazy" data-src="https://www.eimg.top/images/2020/04/08/216a5cf8063d46ffc8799da09dc5a98e.jpg" data-original="https://www.eimg.top/images/2020/04/08/216a5cf8063d46ffc8799da09dc5a98e.jpg" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><p></p>感谢作者分享-<a href="http://bjbsair.com/2020-04-07/tech-info/30656.html" rel="nofollow">http://bjbsair.com/2020-04-07/tech-info/30656.html</a> <p>===</p> <p></p><p></p><img class="b-lazy" data-src="https://www.eimg.top/images/2020/04/08/a51bda47ef9b1c88104ae669ff267375.jpg" data-original="https://www.eimg.top/images/2020/04/08/a51bda47ef9b1c88104ae669ff267375.jpg" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><p></p> <h2 id="你恰好发现了-keras。-7">你恰好发现了 Keras。</h2> <p>Keras 是一个用 Python 编写的高级神经网络 API,它能够以 TensorFlow, CNTK, 或者 Theano 作为后端运行。Keras 的开发重点是支持快速的实验。能够以最小的时延把你的想法转换为实验结果,是做好研究的关键。</p> <p>如果你在以下情况下需要深度学习库,请使用 Keras:</p> <ul><li>允许简单而快速的原型设计(由于用户友好,高度模块化,可扩展性)。</li> <li>同时支持卷积神经网络和循环神经网络,以及两者的组合。</li> <li>在 CPU 和 GPU 上无缝运行。</li> </ul><p>查看文档,请访问 Keras.io。</p> <p>Keras 兼容的 Python 版本: <strong>Python 2.7-3.6</strong>。</p> <hr /><h2 id="指导原则-7">指导原则</h2> <ul><li><strong>用户友好。</strong> Keras 是为人类而不是为机器设计的 API。它把用户体验放在首要和中心位置。Keras 遵循减少认知困难的最佳实践:它提供一致且简单的 API,将常见用例所需的用户操作数量降至最低,并且在用户错误时提供清晰和可操作的反馈。</li> <li><strong>模块化。</strong> 模型被理解为由独立的、完全可配置的模块构成的序列或图。这些模块可以以尽可能少的限制组装在一起。特别是神经网络层、损失函数、优化器、初始化方法、激活函数、正则化方法,它们都是可以结合起来构建新模型的模块。</li> <li><strong>易扩展性。</strong> 新的模块是很容易添加的(作为新的类和函数),现有的模块已经提供了充足的示例。由于能够轻松地创建可以提高表现力的新模块,Keras 更加适合高级研究。</li> <li><strong>基于 Python 实现。</strong> Keras 没有特定格式的单独配置文件。模型定义在 Python 代码中,这些代码紧凑,易于调试,并且易于扩展。</li> </ul><hr /><h2 id="快速开始:30-秒上手-keras-7">快速开始:30 秒上手 Keras</h2> <p>Keras 的核心数据结构是 <strong>model</strong>,一种组织网络层的方式。最简单的模型是 Sequential 顺序模型,它由多个网络层线性堆叠。对于更复杂的结构,你应该使用 Keras 函数式 API,它允许构建任意的神经网络图。</p> <p>Sequential 模型如下所示:</p> <pre>from keras.models import Sequential model = Sequential() </pre> <p>可以简单地使用 .add() 来堆叠模型:</p> <pre>from keras.layers import Dense model.add(Dense(units=64, activation='relu', input_dim=100)) model.add(Dense(units=10, activation='softmax')) </pre> <p>在完成了模型的构建后, 可以使用 .compile() 来配置学习过程:</p> <pre>model.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy']) </pre> <p>如果需要,你还可以进一步地配置你的优化器。Keras 的核心原则是使事情变得相当简单,同时又允许用户在需要的时候能够进行完全的控制(终极的控制是源代码的易扩展性)。</p> <pre>model.compile(loss=keras.losses.categorical_crossentropy, optimizer=keras.optimizers.SGD(lr=0.01, momentum=0.9, nesterov=True)) </pre> <p>现在,你可以批量地在训练数据上进行迭代了:</p> <pre># x_train 和 y_train 是 Numpy 数组 -- 就像在 Scikit-Learn API 中一样。 model.fit(x_train, y_train, epochs=5, batch_size=32) </pre> <p>或者,你可以手动地将批次的数据提供给模型:</p> <pre>model.train_on_batch(x_batch, y_batch) </pre> <p>只需一行代码就能评估模型性能:</p> <pre>loss_and_metrics = model.evaluate(x_test, y_test, batch_size=128) </pre> <p>或者对新的数据生成预测:</p> <pre>classes = model.predict(x_test, batch_size=128) </pre> <p>构建一个问答系统,一个图像分类模型,一个神经图灵机,或者其他的任何模型,就是这么的快。深度学习背后的思想很简单,那么它们的实现又何必要那么痛苦呢?</p> <p>有关 Keras 更深入的教程,请查看:</p> <ul><li>开始使用 Sequential 模型</li> <li>开始使用函数式 API</li> </ul><p>在代码仓库的 examples 目录中,你会找到更多高级模型:基于记忆网络的问答系统、基于栈式 LSTM 的文本生成等等。</p> <hr /><h2 id="安装指引-7">安装指引</h2> <p>在安装 Keras 之前,请安装以下后端引擎之一:TensorFlow,Theano,或者 CNTK。我们推荐 TensorFlow 后端。</p> <ul><li>TensorFlow 安装指引。</li> <li>Theano 安装指引。</li> <li>CNTK 安装指引。</li> </ul><p>你也可以考虑安装以下<strong>可选依赖</strong>:</p> <ul><li>cuDNN (如果你计划在 GPU 上运行 Keras,建议安装)。</li> <li>HDF5 和 h5py (如果你需要将 Keras 模型保存到磁盘,则需要这些)。</li> <li>graphviz 和 pydot (用于可视化工具绘制模型图)。</li> </ul><p>然后你就可以安装 Keras 本身了。有两种方法安装 Keras:</p> <ul><li><strong>使用 PyPI 安装 Keras (推荐):</strong></li> </ul><pre>sudo pip install keras </pre> <p>如果你使用 virtualenv 虚拟环境, 你可以避免使用 sudo:</p> <pre>pip install keras </pre> <ul><li><strong>或者:使用 GitHub 源码安装 Keras:</strong></li> </ul><p>首先,使用 git 来克隆 Keras:</p> <pre>git clone https://github.com/keras-team/keras.git </pre> <p>然后,cd 到 Keras 目录并且运行安装命令:</p> <pre>cd keras sudo python setup.py install </pre> <hr /><h2 id="配置你的-keras-后端-7">配置你的 Keras 后端</h2> <p>默认情况下,Keras 将使用 TensorFlow 作为其张量操作库。请跟随这些指引来配置其他 Keras 后端。</p> <hr /><h2 id="技术支持-7">技术支持</h2> <p>你可以提出问题并参与开发讨论:</p> <ul><li>Keras Google group。</li> <li>Keras Slack channel。 使用 这个链接 向该频道请求邀请函。</li> </ul><p>你也可以在 GitHub issues 中发布<strong>漏洞报告和新功能请求</strong>(仅限于此)。注意请先阅读规范文档。</p> <hr /><h2 id="为什么取名为-keras-7">为什么取名为 Keras?</h2> <p>Keras (κέρας) 在希腊语中意为 号角 。它来自古希腊和拉丁文学中的一个文学形象,首先出现于 《奥德赛》 中, 梦神 (Oneiroi, singular Oneiros) 从这两类人中分离出来:那些用虚幻的景象欺骗人类,通过象牙之门抵达地球之人,以及那些宣告未来即将到来,通过号角之门抵达之人。 它类似于文字寓意,κέρας (号角) / κραίνω (履行),以及 ἐλέφας (象牙) / ἐλεφαίρομαι (欺骗)。</p> <p>Keras 最初是作为 ONEIROS 项目(开放式神经电子智能机器人操作系统)研究工作的一部分而开发的。</p> <blockquote> <p>"Oneiroi 超出了我们的理解 - 谁能确定它们讲述了什么故事?并不是所有人都能找到。那里有两扇门,就是通往短暂的 Oneiroi 的通道;一个是用号角制造的,一个是用象牙制造的。穿过尖锐的象牙的 Oneiroi 是诡计多端的,他们带有一些不会实现的信息; 那些穿过抛光的喇叭出来的人背后具有真理,对于看到他们的人来说是完成的。" Homer, Odyssey 19. 562 ff (Shewring translation).</p> </blockquote> <h1 id="为什么选择-keras?-7">为什么选择 Keras?</h1> <p>在如今无数深度学习框架中,为什么要使用 Keras 而非其他?以下是 Keras 与现有替代品的一些比较。</p> <hr /><h2 id="keras-优先考虑开发人员的经验-7">Keras 优先考虑开发人员的经验</h2> <ul><li>Keras 是为人类而非机器设计的 API。Keras 遵循减少认知困难的最佳实践: 它提供一致且简单的 API,它将常见用例所需的用户操作数量降至最低,并且在用户错误时提供清晰和可操作的反馈。</li> <li>这使 Keras 易于学习和使用。作为 Keras 用户,你的工作效率更高,能够比竞争对手更快地尝试更多创意,从而帮助你赢得机器学习竞赛。</li> <li>这种易用性并不以降低灵活性为代价:因为 Keras 与底层深度学习语言(特别是 TensorFlow)集成在一起,所以它可以让你实现任何你可以用基础语言编写的东西。特别是,tf.keras 作为 Keras API 可以与 TensorFlow 工作流无缝集成。</li> </ul><hr /><h2 id="keras-被工业界和学术界广泛采用-7">Keras 被工业界和学术界广泛采用</h2> <p></p><p></p><img class="b-lazy" data-src="https://www.eimg.top/images/2020/04/08/48903de179733c1f26825542e6a79c33.jpg" data-original="https://www.eimg.top/images/2020/04/08/48903de179733c1f26825542e6a79c33.jpg" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><p></p> <p>Deep learning 框架排名,由 Jeff Hale 基于 7 个分类的 11 个数据源计算得出</p> <p>截至 2018 年中期,Keras 拥有超过 250,000 名个人用户。与其他任何深度学习框架相比,Keras 在行业和研究领域的应用率更高(除 TensorFlow 之外,且 Keras API 是 TensorFlow 的官方前端,通过 tf.keras 模块使用)。</p> <p>您已经不断与使用 Keras 构建的功能进行交互 - 它在 Netflix, Uber, Yelp, Instacart, Zocdoc, Square 等众多网站上使用。它尤其受以深度学习作为产品核心的创业公司的欢迎。</p> <p>Keras也是深度学习研究人员的最爱,在上载到预印本服务器 arXiv.org 的科学论文中被提及的次数位居第二。Keras 还被大型科学组织的研究人员采用,特别是 CERN 和 NASA。</p> <hr /><h2 id="keras-可以轻松将模型转化为产品-7">Keras 可以轻松将模型转化为产品</h2> <p>与任何其他深度学习框架相比,你的 Keras 模型可以在更广泛的平台上轻松部署:</p> <ul><li>在 iOS 上,通过 Apple’s CoreML(苹果为 Keras 提供官方支持)。这里有一个教程。</li> <li>在 Android 上,通过 TensorFlow Android runtime,例如:Not Hotdog app。</li> <li>在浏览器中,通过 GPU 加速的 JavaScript 运行时,例如:Keras.js 和 WebDNN。</li> <li>在 Google Cloud 上,通过 TensorFlow-Serving。</li> <li>在 Python webapp 后端(比如 Flask app)中。</li> <li>在 JVM 上,通过 SkyMind 提供的 DL4J 模型导入。</li> <li>在 Raspberry Pi 树莓派上。</li> </ul><hr /><h2 id="keras-支持多个后端引擎,不会将你锁定到一个生态系统中-7">Keras 支持多个后端引擎,不会将你锁定到一个生态系统中</h2> <p>你的 Keras 模型可以基于不同的深度学习后端开发。重要的是,任何仅利用内置层构建的 Keras 模型,都可以在所有这些后端中移植:你可以用一种后端训练模型,再将它载入另一种后端中(例如为了发布的需要)。支持的后端有:</p> <ul><li>谷歌的 TensorFlow 后端</li> <li>微软的 CNTK 后端</li> <li>Theano 后端</li> </ul><p>亚马逊也正在为 Keras 开发 MXNet 后端。</p> <p>如此一来,你的 Keras 模型可以在 CPU 之外的不同硬件平台上训练:</p> <ul><li>NVIDIA GPU</li> <li>Google TPU,通过 TensorFlow 后端和 Google Cloud</li> <li>OpenCL 支持的 GPU, 比如 AMD, 通过 PlaidML Keras 后端</li> </ul><hr /><h2 id="keras-拥有强大的多-gpu-和分布式训练支持-7">Keras 拥有强大的多 GPU 和分布式训练支持</h2> <ul><li>Keras 内置对多 GPU 数据并行的支持。</li> <li>优步的 Horovod 对 Keras 模型拥有一流的支持。</li> <li>Keras 模型可以被转换为 TensorFlow Estimators 并在 Google Cloud 的 GPU 集群上训练。</li> <li>Keras 可以在 Spark(通过 CERN 的 Dist-Keras)和 Elephas 上运行。</li> </ul><hr /><h2 id="keras-的发展得到深度学习生态系统中的关键公司的支持-7">Keras 的发展得到深度学习生态系统中的关键公司的支持</h2> <p>Keras 的开发主要由谷歌支持,Keras API 以 tf.keras 的形式包装在 TensorFlow 中。此外,微软维护着 Keras 的 CNTK 后端。亚马逊 AWS 正在开发 MXNet 支持。其他提供支持的公司包括 NVIDIA、优步、苹果(通过 CoreML)等。</p> <p></p><p></p><img class="b-lazy" data-src="https://www.eimg.top/images/2020/04/08/10265d53929f2da429382578a1e747b8.jpg" data-original="https://www.eimg.top/images/2020/04/08/10265d53929f2da429382578a1e747b8.jpg" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><p></p> <p></p><p></p><img class="b-lazy" data-src="https://www.eimg.top/images/2020/04/08/00462f1f0ac503f936eed167c7b46f4c.jpg" data-original="https://www.eimg.top/images/2020/04/08/00462f1f0ac503f936eed167c7b46f4c.jpg" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><p></p> <p></p><p></p><img class="b-lazy" data-src="https://www.eimg.top/images/2020/04/08/a772b6b9ce5db55295ae530adeda994d.jpg" data-original="https://www.eimg.top/images/2020/04/08/a772b6b9ce5db55295ae530adeda994d.jpg" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><p></p> <p></p><p></p><img class="b-lazy" data-src="https://www.eimg.top/images/2020/04/08/f801810f2ba61af2733a3480fefa5baa.jpg" data-original="https://www.eimg.top/images/2020/04/08/f801810f2ba61af2733a3480fefa5baa.jpg" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><p></p>感谢作者分享-<a href="http://bjbsair.com/2020-04-07/tech-info/30656.html" rel="nofollow">http://bjbsair.com/2020-04-07/tech-info/30656.html</a> <p>===</p> <p></p><p></p><img class="b-lazy" data-src="https://www.eimg.top/images/2020/04/08/d2a3064bb70d7ca21427a6c4dcbf0ea1.jpg" data-original="https://www.eimg.top/images/2020/04/08/d2a3064bb70d7ca21427a6c4dcbf0ea1.jpg" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><p></p> <h2 id="你恰好发现了-keras。-8">你恰好发现了 Keras。</h2> <p>Keras 是一个用 Python 编写的高级神经网络 API,它能够以 TensorFlow, CNTK, 或者 Theano 作为后端运行。Keras 的开发重点是支持快速的实验。能够以最小的时延把你的想法转换为实验结果,是做好研究的关键。</p> <p>如果你在以下情况下需要深度学习库,请使用 Keras:</p> <ul><li>允许简单而快速的原型设计(由于用户友好,高度模块化,可扩展性)。</li> <li>同时支持卷积神经网络和循环神经网络,以及两者的组合。</li> <li>在 CPU 和 GPU 上无缝运行。</li> </ul><p>查看文档,请访问 Keras.io。</p> <p>Keras 兼容的 Python 版本: <strong>Python 2.7-3.6</strong>。</p> <hr /><h2 id="指导原则-8">指导原则</h2> <ul><li><strong>用户友好。</strong> Keras 是为人类而不是为机器设计的 API。它把用户体验放在首要和中心位置。Keras 遵循减少认知困难的最佳实践:它提供一致且简单的 API,将常见用例所需的用户操作数量降至最低,并且在用户错误时提供清晰和可操作的反馈。</li> <li><strong>模块化。</strong> 模型被理解为由独立的、完全可配置的模块构成的序列或图。这些模块可以以尽可能少的限制组装在一起。特别是神经网络层、损失函数、优化器、初始化方法、激活函数、正则化方法,它们都是可以结合起来构建新模型的模块。</li> <li><strong>易扩展性。</strong> 新的模块是很容易添加的(作为新的类和函数),现有的模块已经提供了充足的示例。由于能够轻松地创建可以提高表现力的新模块,Keras 更加适合高级研究。</li> <li><strong>基于 Python 实现。</strong> Keras 没有特定格式的单独配置文件。模型定义在 Python 代码中,这些代码紧凑,易于调试,并且易于扩展。</li> </ul><hr /><h2 id="快速开始:30-秒上手-keras-8">快速开始:30 秒上手 Keras</h2> <p>Keras 的核心数据结构是 <strong>model</strong>,一种组织网络层的方式。最简单的模型是 Sequential 顺序模型,它由多个网络层线性堆叠。对于更复杂的结构,你应该使用 Keras 函数式 API,它允许构建任意的神经网络图。</p> <p>Sequential 模型如下所示:</p> <pre>from keras.models import Sequential model = Sequential() </pre> <p>可以简单地使用 .add() 来堆叠模型:</p> <pre>from keras.layers import Dense model.add(Dense(units=64, activation='relu', input_dim=100)) model.add(Dense(units=10, activation='softmax')) </pre> <p>在完成了模型的构建后, 可以使用 .compile() 来配置学习过程:</p> <pre>model.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy']) </pre> <p>如果需要,你还可以进一步地配置你的优化器。Keras 的核心原则是使事情变得相当简单,同时又允许用户在需要的时候能够进行完全的控制(终极的控制是源代码的易扩展性)。</p> <pre>model.compile(loss=keras.losses.categorical_crossentropy, optimizer=keras.optimizers.SGD(lr=0.01, momentum=0.9, nesterov=True)) </pre> <p>现在,你可以批量地在训练数据上进行迭代了:</p> <pre># x_train 和 y_train 是 Numpy 数组 -- 就像在 Scikit-Learn API 中一样。 model.fit(x_train, y_train, epochs=5, batch_size=32) </pre> <p>或者,你可以手动地将批次的数据提供给模型:</p> <pre>model.train_on_batch(x_batch, y_batch) </pre> <p>只需一行代码就能评估模型性能:</p> <pre>loss_and_metrics = model.evaluate(x_test, y_test, batch_size=128) </pre> <p>或者对新的数据生成预测:</p> <pre>classes = model.predict(x_test, batch_size=128) </pre> <p>构建一个问答系统,一个图像分类模型,一个神经图灵机,或者其他的任何模型,就是这么的快。深度学习背后的思想很简单,那么它们的实现又何必要那么痛苦呢?</p> <p>有关 Keras 更深入的教程,请查看:</p> <ul><li>开始使用 Sequential 模型</li> <li>开始使用函数式 API</li> </ul><p>在代码仓库的 examples 目录中,你会找到更多高级模型:基于记忆网络的问答系统、基于栈式 LSTM 的文本生成等等。</p> <hr /><h2 id="安装指引-8">安装指引</h2> <p>在安装 Keras 之前,请安装以下后端引擎之一:TensorFlow,Theano,或者 CNTK。我们推荐 TensorFlow 后端。</p> <ul><li>TensorFlow 安装指引。</li> <li>Theano 安装指引。</li> <li>CNTK 安装指引。</li> </ul><p>你也可以考虑安装以下<strong>可选依赖</strong>:</p> <ul><li>cuDNN (如果你计划在 GPU 上运行 Keras,建议安装)。</li> <li>HDF5 和 h5py (如果你需要将 Keras 模型保存到磁盘,则需要这些)。</li> <li>graphviz 和 pydot (用于可视化工具绘制模型图)。</li> </ul><p>然后你就可以安装 Keras 本身了。有两种方法安装 Keras:</p> <ul><li><strong>使用 PyPI 安装 Keras (推荐):</strong></li> </ul><pre>sudo pip install keras </pre> <p>如果你使用 virtualenv 虚拟环境, 你可以避免使用 sudo:</p> <pre>pip install keras </pre> <ul><li><strong>或者:使用 GitHub 源码安装 Keras:</strong></li> </ul><p>首先,使用 git 来克隆 Keras:</p> <pre>git clone https://github.com/keras-team/keras.git </pre> <p>然后,cd 到 Keras 目录并且运行安装命令:</p> <pre>cd keras sudo python setup.py install </pre> <hr /><h2 id="配置你的-keras-后端-8">配置你的 Keras 后端</h2> <p>默认情况下,Keras 将使用 TensorFlow 作为其张量操作库。请跟随这些指引来配置其他 Keras 后端。</p> <hr /><h2 id="技术支持-8">技术支持</h2> <p>你可以提出问题并参与开发讨论:</p> <ul><li>Keras Google group。</li> <li>Keras Slack channel。 使用 这个链接 向该频道请求邀请函。</li> </ul><p>你也可以在 GitHub issues 中发布<strong>漏洞报告和新功能请求</strong>(仅限于此)。注意请先阅读规范文档。</p> <hr /><h2 id="为什么取名为-keras-8">为什么取名为 Keras?</h2> <p>Keras (κέρας) 在希腊语中意为 号角 。它来自古希腊和拉丁文学中的一个文学形象,首先出现于 《奥德赛》 中, 梦神 (Oneiroi, singular Oneiros) 从这两类人中分离出来:那些用虚幻的景象欺骗人类,通过象牙之门抵达地球之人,以及那些宣告未来即将到来,通过号角之门抵达之人。 它类似于文字寓意,κέρας (号角) / κραίνω (履行),以及 ἐλέφας (象牙) / ἐλεφαίρομαι (欺骗)。</p> <p>Keras 最初是作为 ONEIROS 项目(开放式神经电子智能机器人操作系统)研究工作的一部分而开发的。</p> <blockquote> <p>"Oneiroi 超出了我们的理解 - 谁能确定它们讲述了什么故事?并不是所有人都能找到。那里有两扇门,就是通往短暂的 Oneiroi 的通道;一个是用号角制造的,一个是用象牙制造的。穿过尖锐的象牙的 Oneiroi 是诡计多端的,他们带有一些不会实现的信息; 那些穿过抛光的喇叭出来的人背后具有真理,对于看到他们的人来说是完成的。" Homer, Odyssey 19. 562 ff (Shewring translation).</p> </blockquote> <h1 id="为什么选择-keras?-8">为什么选择 Keras?</h1> <p>在如今无数深度学习框架中,为什么要使用 Keras 而非其他?以下是 Keras 与现有替代品的一些比较。</p> <hr /><h2 id="keras-优先考虑开发人员的经验-8">Keras 优先考虑开发人员的经验</h2> <ul><li>Keras 是为人类而非机器设计的 API。Keras 遵循减少认知困难的最佳实践: 它提供一致且简单的 API,它将常见用例所需的用户操作数量降至最低,并且在用户错误时提供清晰和可操作的反馈。</li> <li>这使 Keras 易于学习和使用。作为 Keras 用户,你的工作效率更高,能够比竞争对手更快地尝试更多创意,从而帮助你赢得机器学习竞赛。</li> <li>这种易用性并不以降低灵活性为代价:因为 Keras 与底层深度学习语言(特别是 TensorFlow)集成在一起,所以它可以让你实现任何你可以用基础语言编写的东西。特别是,tf.keras 作为 Keras API 可以与 TensorFlow 工作流无缝集成。</li> </ul><hr /><h2 id="keras-被工业界和学术界广泛采用-8">Keras 被工业界和学术界广泛采用</h2> <p></p><p></p><img class="b-lazy" data-src="https://www.eimg.top/images/2020/04/08/1e66e9bf7d97242c959273d3f1ae5604.jpg" data-original="https://www.eimg.top/images/2020/04/08/1e66e9bf7d97242c959273d3f1ae5604.jpg" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><p></p> <p>Deep learning 框架排名,由 Jeff Hale 基于 7 个分类的 11 个数据源计算得出</p> <p>截至 2018 年中期,Keras 拥有超过 250,000 名个人用户。与其他任何深度学习框架相比,Keras 在行业和研究领域的应用率更高(除 TensorFlow 之外,且 Keras API 是 TensorFlow 的官方前端,通过 tf.keras 模块使用)。</p> <p>您已经不断与使用 Keras 构建的功能进行交互 - 它在 Netflix, Uber, Yelp, Instacart, Zocdoc, Square 等众多网站上使用。它尤其受以深度学习作为产品核心的创业公司的欢迎。</p> <p>Keras也是深度学习研究人员的最爱,在上载到预印本服务器 arXiv.org 的科学论文中被提及的次数位居第二。Keras 还被大型科学组织的研究人员采用,特别是 CERN 和 NASA。</p> <hr /><h2 id="keras-可以轻松将模型转化为产品-8">Keras 可以轻松将模型转化为产品</h2> <p>与任何其他深度学习框架相比,你的 Keras 模型可以在更广泛的平台上轻松部署:</p> <ul><li>在 iOS 上,通过 Apple’s CoreML(苹果为 Keras 提供官方支持)。这里有一个教程。</li> <li>在 Android 上,通过 TensorFlow Android runtime,例如:Not Hotdog app。</li> <li>在浏览器中,通过 GPU 加速的 JavaScript 运行时,例如:Keras.js 和 WebDNN。</li> <li>在 Google Cloud 上,通过 TensorFlow-Serving。</li> <li>在 Python webapp 后端(比如 Flask app)中。</li> <li>在 JVM 上,通过 SkyMind 提供的 DL4J 模型导入。</li> <li>在 Raspberry Pi 树莓派上。</li> </ul><hr /><h2 id="keras-支持多个后端引擎,不会将你锁定到一个生态系统中-8">Keras 支持多个后端引擎,不会将你锁定到一个生态系统中</h2> <p>你的 Keras 模型可以基于不同的深度学习后端开发。重要的是,任何仅利用内置层构建的 Keras 模型,都可以在所有这些后端中移植:你可以用一种后端训练模型,再将它载入另一种后端中(例如为了发布的需要)。支持的后端有:</p> <ul><li>谷歌的 TensorFlow 后端</li> <li>微软的 CNTK 后端</li> <li>Theano 后端</li> </ul><p>亚马逊也正在为 Keras 开发 MXNet 后端。</p> <p>如此一来,你的 Keras 模型可以在 CPU 之外的不同硬件平台上训练:</p> <ul><li>NVIDIA GPU</li> <li>Google TPU,通过 TensorFlow 后端和 Google Cloud</li> <li>OpenCL 支持的 GPU, 比如 AMD, 通过 PlaidML Keras 后端</li> </ul><hr /><h2 id="keras-拥有强大的多-gpu-和分布式训练支持-8">Keras 拥有强大的多 GPU 和分布式训练支持</h2> <ul><li>Keras 内置对多 GPU 数据并行的支持。</li> <li>优步的 Horovod 对 Keras 模型拥有一流的支持。</li> <li>Keras 模型可以被转换为 TensorFlow Estimators 并在 Google Cloud 的 GPU 集群上训练。</li> <li>Keras 可以在 Spark(通过 CERN 的 Dist-Keras)和 Elephas 上运行。</li> </ul><hr /><h2 id="keras-的发展得到深度学习生态系统中的关键公司的支持-8">Keras 的发展得到深度学习生态系统中的关键公司的支持</h2> <p>Keras 的开发主要由谷歌支持,Keras API 以 tf.keras 的形式包装在 TensorFlow 中。此外,微软维护着 Keras 的 CNTK 后端。亚马逊 AWS 正在开发 MXNet 支持。其他提供支持的公司包括 NVIDIA、优步、苹果(通过 CoreML)等。</p> <p></p><p></p><img class="b-lazy" data-src="https://www.eimg.top/images/2020/04/08/cc2919deca09fe6f67198e5dcb4e0d23.jpg" data-original="https://www.eimg.top/images/2020/04/08/cc2919deca09fe6f67198e5dcb4e0d23.jpg" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><p></p> <p></p><p></p><img class="b-lazy" data-src="https://www.eimg.top/images/2020/04/08/d25e0b0b3023ee3fadecab02ccfae5d3.jpg" data-original="https://www.eimg.top/images/2020/04/08/d25e0b0b3023ee3fadecab02ccfae5d3.jpg" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><p></p> <p></p><p></p><img class="b-lazy" data-src="https://www.eimg.top/images/2020/04/08/f11257a843ab3fc2aa86d5b491a93b82.jpg" data-original="https://www.eimg.top/images/2020/04/08/f11257a843ab3fc2aa86d5b491a93b82.jpg" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><p></p> <p></p><p></p><img class="b-lazy" data-src="https://www.eimg.top/images/2020/04/08/ed544d749e802b2f623d07a44d86b9aa.jpg" data-original="https://www.eimg.top/images/2020/04/08/ed544d749e802b2f623d07a44d86b9aa.jpg" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><p></p> <div class="alert alert-success" role="alert"><p>来源:<code>https://www.cnblogs.com/lihanlin/p/12657714.html</code></p></div></div> <div class="field field--name-field-tags field--type-entity-reference field--label-above"> <div class="field--label">标签</div> <div class="field--items"> <div class="field--item"><a href="/tag/keras" hreflang="zh-hans">keras</a></div> <div class="field--item"><a href="/tag/jiqixuexi" hreflang="zh-hans">机器学习</a></div> <div class="field--item"><a href="/tag/theano" hreflang="zh-hans">theano</a></div> <div class="field--item"><a href="/tag/cntk" hreflang="zh-hans">cntk</a></div> <div class="field--item"><a href="/tag/tensorflow" hreflang="zh-hans">tensorflow</a></div> <div class="field--item"><a href="/tag/shenduxuexi" hreflang="zh-hans">深度学习</a></div> <div class="field--item"><a href="/tag/pythonhanshu" hreflang="zh-hans">python函数</a></div> <div class="field--item"><a href="/tag/pythonshenjingwangluo" hreflang="zh-hans">python神经网络</a></div> <div class="field--item"><a href="/tag/shenjingwangluomoxing" hreflang="zh-hans">神经网络模型</a></div> <div class="field--item"><a href="/tag/bianchengyuyan" hreflang="zh-hans">编程语言</a></div> <div class="field--item"><a href="/tag/python" hreflang="zh-hans">python</a></div> </div> </div> Wed, 08 Apr 2020 00:31:19 +0000 跟風遠走 3555996 at https://www.e-learn.cn python函数(二) https://www.e-learn.cn/topic/3555801 <span>python函数(二)</span> <span><span lang="" about="/user/80" typeof="schema:Person" property="schema:name" datatype="">我是研究僧i</span></span> <span>2020-04-08 07:02:21</span> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"> <p>一:函数对象:函数是第一类对象,即函数可以当作数据传递</p> <p>=================================<br /> 1 可以被引用<br /> 2 可以当作参数传递<br /> 3 返回值可以是函数<br />4 可以当作容器类型的元素</p> <p>=================================</p> <p>1.函数可以被引用</p> <pre>1 def foo(): 2 print('from foo') 3 func=foo 4 5 print(foo) 6 print(func) 7 func()</pre> <p>执行结果</p> <p>&lt;function foo at 0x00000000006FF598&gt;<br />&lt;function foo at 0x00000000006FF598&gt;<br />from foo</p> <p>函数名本身表示的就是内存地址,可以被其他对象引用</p> <p>2.被当做参数传递</p> <img id="code_img_closed_dce7d1d1-463b-41d2-a3e8-79e38fc9ebcd" class="code_img_closed b-lazy" alt="" data-src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" data-original="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><img id="code_img_opened_dce7d1d1-463b-41d2-a3e8-79e38fc9ebcd" class="code_img_opened b-lazy" style="display: none;" onclick="cnblogs_code_hide('dce7d1d1-463b-41d2-a3e8-79e38fc9ebcd',event)" alt="" data-src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" data-original="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><div id="cnblogs_code_open_dce7d1d1-463b-41d2-a3e8-79e38fc9ebcd" class="cnblogs_code_hide"> <pre>def foo(): print('from foo') def bar(func): print(func) func() bar(foo)</pre> </div> <span class="cnblogs_code_collapse">View Code</span> <p>执行结果</p> <p>&lt;function foo at 0x000000000082F598&gt;<br />from foo</p> <p>3.返回值可以是函数</p> <pre>def foo(): print('from foo') def bar(func): return func f=bar(foo) print(f) f()</pre> <p>执行结果</p> <p>&lt;function foo at 0x0000000000A6F598&gt;<br />from foo</p> <p>bar(foo)返回的就是foo本身,所有f和foo都指向同一块内存地址</p> <p>4.可以当做容器类型的元素</p> <p> </p> <img id="code_img_closed_21b414a4-e189-4fc3-ac84-ffe6d63aca07" class="code_img_closed b-lazy" alt="" data-src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" data-original="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><img id="code_img_opened_21b414a4-e189-4fc3-ac84-ffe6d63aca07" class="code_img_opened b-lazy" style="display: none;" onclick="cnblogs_code_hide('21b414a4-e189-4fc3-ac84-ffe6d63aca07',event)" alt="" data-src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" data-original="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><div id="cnblogs_code_open_21b414a4-e189-4fc3-ac84-ffe6d63aca07" class="cnblogs_code_hide"> <pre>def select(sql): print('==========select') def delete(sql): print('==========delete') def insert(sql): print('==========insert') def update(sql): print('==========update') func_dict={ 'select':select, 'update':update, 'insert':insert, 'delete':delete } while True: in_sql=input('sql&gt;').strip() sql=in_sql.split() cmd=sql[0] if cmd in func_dict: func_dict[cmd](sql) else: print('error')</pre> </div> <span class="cnblogs_code_collapse">View Code</span> <p>二、函数嵌套</p> <p>1.函数的嵌套定义</p> <img id="code_img_closed_382d02bc-1cc3-4335-ac46-a903e3f81cbd" class="code_img_closed b-lazy" alt="" data-src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" data-original="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><img id="code_img_opened_382d02bc-1cc3-4335-ac46-a903e3f81cbd" class="code_img_opened b-lazy" style="display: none;" onclick="cnblogs_code_hide('382d02bc-1cc3-4335-ac46-a903e3f81cbd',event)" alt="" data-src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" data-original="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><div id="cnblogs_code_open_382d02bc-1cc3-4335-ac46-a903e3f81cbd" class="cnblogs_code_hide"> <pre>def f1(): def f2(): print('from f2') def f3(): print('from f3') f3() f2() f1()</pre> </div> <span class="cnblogs_code_collapse">View Code</span> <p>2.函数的嵌套调用</p> <img id="code_img_closed_6ff3c6b1-5c02-4bd2-8b0a-2520c9ad51fd" class="code_img_closed b-lazy" alt="" data-src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" data-original="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><img id="code_img_opened_6ff3c6b1-5c02-4bd2-8b0a-2520c9ad51fd" class="code_img_opened b-lazy" style="display: none;" onclick="cnblogs_code_hide('6ff3c6b1-5c02-4bd2-8b0a-2520c9ad51fd',event)" alt="" data-src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" data-original="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><div id="cnblogs_code_open_6ff3c6b1-5c02-4bd2-8b0a-2520c9ad51fd" class="cnblogs_code_hide"> <pre>def max2(x,y): return x if x &gt; y else y def max4(a,b,c,d): res1=max2(a,b) res2=max2(res1,c) res3=max2(res2,d) return res3 print(max4(10,99,31,22))</pre> </div> <span class="cnblogs_code_collapse">View Code</span> <p>三、名称空间与作用域</p> <p>(一)名称空间包含有三种</p> <p>1.内置名称空间</p> <p>2.全局名称空间</p> <p>3.局部名称空间</p> <p> </p> <p>引:名字(名称)的定义</p> <p>变量</p> <p>name='larry'</p> <p>函数</p> <p>def func():</p> <p>   pass</p> <p>类</p> <p>class human:</p> <p>  pass</p> <p>1.内置名称空间</p> <p>随着解释器的启动而产生</p> <p>import builtins<br />for i in dir(builtins):<br />   print(i)</p> <p>2.全局名称空间</p> <p>文件的执行会产生全局名称空间,指的是文件级别定义的名字都会放入该空间</p> <p>3.局部名称空间</p> <p>调用函数时会产生局部名称空间,只在函数调用时临时绑定,调用结束解绑定</p> <img id="code_img_closed_b0e83d8f-b864-44c4-8cc6-c9856bee09b8" class="code_img_closed b-lazy" alt="" data-src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" data-original="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><img id="code_img_opened_b0e83d8f-b864-44c4-8cc6-c9856bee09b8" class="code_img_opened b-lazy" style="display: none;" onclick="cnblogs_code_hide('b0e83d8f-b864-44c4-8cc6-c9856bee09b8',event)" alt="" data-src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" data-original="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><div id="cnblogs_code_open_b0e83d8f-b864-44c4-8cc6-c9856bee09b8" class="cnblogs_code_hide"> <pre>x=10000 def func(): x=1 print(x) func() print(x)</pre> </div> <span class="cnblogs_code_collapse">View Code</span> <p>执行结果</p> <p>1</p> <p>10000</p> <p>(二)作用域</p> <p>1.全局作用域:内置名称空间,全局名称空间</p> <p>2.局部作用域:局部名称空间</p> <p>名字的查找顺序:局部名称空间---》全局名层空间---》内置名称空间</p> <img id="code_img_closed_1dac8802-1ff9-4e36-ad11-2ddeae04f6c8" class="code_img_closed b-lazy" alt="" data-src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" data-original="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><img id="code_img_opened_1dac8802-1ff9-4e36-ad11-2ddeae04f6c8" class="code_img_opened b-lazy" style="display: none;" onclick="cnblogs_code_hide('1dac8802-1ff9-4e36-ad11-2ddeae04f6c8',event)" alt="" data-src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" data-original="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><div id="cnblogs_code_open_1dac8802-1ff9-4e36-ad11-2ddeae04f6c8" class="cnblogs_code_hide"> <pre>x=1 def func(): x=2 print(x) sum=123123 print(sum) func()</pre> </div> <span class="cnblogs_code_collapse">View Code</span> <p>执行结果</p> <p>2</p> <p>123123</p> <p>#查看全局作用域内的名字:gloabls()<br />#查看局局作用域内的名字:locals()</p> <img id="code_img_closed_ab9df108-7b41-4baa-9611-aa1d8c4b441c" class="code_img_closed b-lazy" alt="" data-src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" data-original="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><img id="code_img_opened_ab9df108-7b41-4baa-9611-aa1d8c4b441c" class="code_img_opened b-lazy" style="display: none;" onclick="cnblogs_code_hide('ab9df108-7b41-4baa-9611-aa1d8c4b441c',event)" alt="" data-src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" data-original="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><div id="cnblogs_code_open_ab9df108-7b41-4baa-9611-aa1d8c4b441c" class="cnblogs_code_hide"> <pre>x=1000 def func(): x=2 print(globals()) print(locals()) print(globals() is locals())</pre> </div> <span class="cnblogs_code_collapse">View Code</span> <p>执行结果</p> <p>{'__loader__': &lt;_frozen_importlib_external.SourceFileLoader object at 0x0000000000556C18&gt;, '__spec__': None, '__package__': None, '__file__': 'C:/Users/larry/PycharmProjects/python/day04/fun_exc.py', '__cached__': None, '__name__': '__main__', '__doc__': None, 'func': &lt;function func at 0x000000000071D6A8&gt;, 'x': 1000, '__builtins__': &lt;module 'builtins' (built-in)&gt;}<br />{'__loader__': &lt;_frozen_importlib_external.SourceFileLoader object at 0x0000000000556C18&gt;, '__spec__': None, '__package__': None, '__file__': 'C:/Users/larry/PycharmProjects/python/day04/fun_exc.py', '__cached__': None, '__name__': '__main__', '__doc__': None, 'func': &lt;function func at 0x000000000071D6A8&gt;, 'x': 1000, '__builtins__': &lt;module 'builtins' (built-in)&gt;}<br />True</p> <img id="code_img_closed_68314db2-8bb0-45ed-96c0-bbb869106a54" class="code_img_closed b-lazy" alt="" data-src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" data-original="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><img id="code_img_opened_68314db2-8bb0-45ed-96c0-bbb869106a54" class="code_img_opened b-lazy" style="display: none;" onclick="cnblogs_code_hide('68314db2-8bb0-45ed-96c0-bbb869106a54',event)" alt="" data-src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" data-original="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><div id="cnblogs_code_open_68314db2-8bb0-45ed-96c0-bbb869106a54" class="cnblogs_code_hide"> <pre>x=1000 def func(): x=2 print(globals()) print(locals()) print(globals() is locals()) func()</pre> </div> <span class="cnblogs_code_collapse">View Code</span> <p>执行结果</p> <p>{'func': &lt;function func at 0x000000000102D6A8&gt;, '__name__': '__main__', '__doc__': None, '__package__': None, '__spec__': None, '__loader__': &lt;_frozen_importlib_external.SourceFileLoader object at 0x00000000006B6C18&gt;, '__file__': 'C:/Users/larry/PycharmProjects/python/day04/fun_exc.py', '__cached__': None, '__builtins__': &lt;module 'builtins' (built-in)&gt;, 'x': 1000}<br />{'x': 2}<br />False</p> <p>#全局作用域:全局有效,在任何位置都能被访问到,除非del删掉,否则会一直存活到文件执行完毕<br />#局部作用域的名字:局部有效,只能在局部范围调用,只在函数调用时才有效,调用结束就失效</p> <img id="code_img_closed_7a70ae18-0e5c-433a-93ff-035b95e5bef3" class="code_img_closed b-lazy" alt="" data-src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" data-original="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><img id="code_img_opened_7a70ae18-0e5c-433a-93ff-035b95e5bef3" class="code_img_opened b-lazy" style="display: none;" onclick="cnblogs_code_hide('7a70ae18-0e5c-433a-93ff-035b95e5bef3',event)" alt="" data-src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" data-original="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><div id="cnblogs_code_open_7a70ae18-0e5c-433a-93ff-035b95e5bef3" class="cnblogs_code_hide"> <pre>x=1 def f1(): print(x) def foo(): print(x) def f(x): x=4 def f2(): x=3 def f3(): x=2 print(x) f3() f2() f(4)</pre> </div> <span class="cnblogs_code_collapse">View Code</span> <p>函数调用时局部有效</p> <p> </p> <div class="alert alert-success" role="alert"><p>来源:<code>https://www.cnblogs.com/geek-ace/p/6906569.html</code></p></div></div> <div class="field field--name-field-tags field--type-entity-reference field--label-above"> <div class="field--label">标签</div> <div class="field--items"> <div class="field--item"><a href="/tag/pythonhanshu" hreflang="zh-hans">python函数</a></div> <div class="field--item"><a href="/tag/python" hreflang="zh-hans">python</a></div> </div> </div> Tue, 07 Apr 2020 23:02:21 +0000 我是研究僧i 3555801 at https://www.e-learn.cn python 核心编程 第十四章 https://www.e-learn.cn/topic/3554783 <span>python 核心编程 第十四章</span> <span><span lang="" about="/user/155" typeof="schema:Person" property="schema:name" datatype="">和自甴很熟</span></span> <span>2020-04-07 19:41:37</span> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"> <h2 id="python-运行外部程序或内部动态生成的程序段">python 运行外部程序或内部动态生成的程序段</h2> <h4 id="函数">函数</h4> <ol><li>内建函数(BIFs)<br /> BIF 属性 描述<br /> bif.<strong>doc</strong> 文档字符串(或 None)<br /> bif.<strong>name</strong> 字符串类型的文档名字<br /> bif.<strong>self</strong> 设置为 None(保留给 built-in 方法)<br /> bif.<strong>module</strong> 存放 bif 定义的模块名字(或 None)</li> <li>用户定义的函数属性(UDF)<br /> UDF 属性 描述<br /> udf.<strong>doc</strong> 文档字符串(也可以用 udf.func_doc)<br /> udf.<strong>name</strong> 字符串类型的函数名字(也可以用 udf.func_name)<br /> udf.func_code 字节编译的代码对象<br /> udf.func_defaults 默认的参数元组<br /> udf.func_globals 全局名字空间字典; 和从函数内部调用 globals(x)一样<br /> udf.func_dict 函数属性的名字空间<br /> udf.func_doc (见上面的 udf.<strong>doc</strong>)<br /> udf.func_name (见上面的 udf.<strong>name</strong>)<br /> udf.func_closure 包含了自由变量的引用的单元对象元组(自用变量在 UDF 中使用,但在别处定义;参见 python[语言]参考手册)</li> </ol><h4 id="方法">方法</h4> <ol><li>内建方法(BIM)属性<br /> BIM 属性 描述<br /> bim.<strong>doc</strong> 文档字串<br /> bim.<strong>name</strong> 字符串类型的函数名字<br /> bim.<strong>self</strong> 绑定的对象</li> <li>用户自定义的方法(UDM)<br /> UDM 属性 描述<br /> udm.<strong>doc</strong> 文档字符串(与 udm.im_fuc.__doc__相同)<br /> udm.<strong>name</strong> 字符串类型的方法名字(与 umd.im_func.__name__相同)<br /> udm.<strong>module</strong> 定义 udm 的模块的名字(或 none)<br /> udm.im_class 方法相关联的类 (对于绑定的方法; 如果是非绑定, 那么为要求 udm 的类)<br /> udm.im_func 方法的函数对象(见 UDFs)<br /> udm.im_self 如果绑定的话为相关联的实例,如果非绑定位为 none</li> </ol><p><strong>调用类的实例,需要实现__call__方法</strong></p> <h4 id="代码对象">代码对象</h4> <ol><li>callable():<br /> 确定一个函数是否是可调用对象,也就是是否可以通过函数操作"()"来调用,返回一个布尔值。</li> <li>compile():代码运行时,生成代码对象。<br /> compile 的三个参数都是必需的,第一参数代表了要编译的 python 代码。第二个字符串,虽然<br /> 是必需的,但通常被置为空串。该参数代表了存放代码对象的文件的名字(字符串类型) 。compile 的<br /> 通常用法是动态生成字符串形式的 Python 代码, 然后生成一个代码对象——代码显然没有存放在<br /> 任何文件。<br /> 最后的参数是个字符串,它用来表明代码对象的类型。有三个可能值:<br /> 'eval' 可求值的表达式[和 eval()一起使用]<br /> 'single' 单一可执行语句[和 exec 一起使用]<br /> 'exec' 可执行语句组[和 exec 一起使用]</li> </ol><pre>eval_code = compile("100+2", "", "eval") single_code = compile(r"print 'Hello world!'", "", 'single') exec_code = compile(""" req = input("Count how many numbers?") for eachNum in range(req): print eachNum """, "", "exec") eval(eval_code) exec single_code exec exec_code Hello world! Count how many numbers?3 0 1 2 </pre> <ol start="3"><li>exec 可以直接使用字符串执行,但如果使用compil()速度会更快一点。 他还可以接受python文件对象</li> </ol><pre>f = open("text.txt") exec f f.seek(0) exec f </pre> <p>之所以使用seek()的原因是,调用一次exec后文件指针会在文件最末尾,这样在调用一次exec就如同没有效用一样<br /> 4. input() 等价于 eval(raw_input())</p> <h4 id="在python运行时生成和执行python代码">在python运行时生成和执行python代码</h4> <pre>dashes = "\n" + "- " * 50 exec_dict = {"f":""" for %s in %s: print %s""", "s": """ %s = 0 %s = %s while %s &lt; len(%s): print %s[%s] %s = %s +1""", "n": """ %s = %d while %s &lt; %d: print %s %s = %s + %d"""} def main(): ltype = raw_input("loop type?(For/While)") dtype = raw_input("Data type?(Number/Seq)") if dtype == "n": start = input("Starting value") stop = input("Ending value (Non-inclusive)?") step = input("stepping value?") seq = str(range(start, stop, step)) else: seq = raw_input("enter sequence?") var = raw_input("Iterative variable name?") if ltype == "f": exec_str = exec_dict["f"] % (var, seq, var) elif ltype == 'w': if dtype == "s": svar = raw_input("enter sequence name?") exec_str = exec_dict["s"]%(var, svar, seq, var, svar, svar, var, var, var) elif dtype == "n": exec_str = exec_dict["n"]%(var, start, var, stop, var, var, var, step) print dashes print exec_str, dashes exec exec_str print dashes if __name__ == '__main__': main() </pre> <p>有条件的执行代码</p> <pre>def bar(): return True def foo(): "foo() does not do much" return True bar.__doc__ = "bar() does not do much" foo.tester = """ if foo(): print 'PASSED' else: print 'FAILED'""" print dir() for eachAttr in dir(): obj = eval(eachAttr) if isinstance(obj, type(foo)): if hasattr(obj, "__doc__"): print "\nfunction '%s' has a doc string:\n\t%s" % (eachAttr, obj.__doc__) if hasattr(obj, "tester"): print "function '%s' has a tester...executing" % eachAttr exec obj.tester else: print "function '%s' has no tester...skipping" % eachAttr else: print "%s is not a function" % eachAttr </pre> <p>程序输出</p> <pre>['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'bar', 'foo'] __builtins__ is not a function __doc__ is not a function __file__ is not a function __name__ is not a function __package__ is not a function function 'bar' has a doc string: bar() does not do much function 'bar' has no tester...skipping function 'foo' has a doc string: foo() does not do much function 'foo' has a tester...executing PASSED </pre> <h4 id="执行其他python程序">执行其他python程序</h4> <p>execfile()函数<br /> execfile(filename, globals=globals(), locals=locals())</p> <h4 id="执行其他非python程序">执行其他非python程序</h4> <p>os.system()执行命令行<br /> os.popen()</p> <p>此章练习跳过</p> <div class="alert alert-success" role="alert"><p>来源:<code>https://www.cnblogs.com/jikeboy/p/6028590.html</code></p></div></div> <div class="field field--name-field-tags field--type-entity-reference field--label-above"> <div class="field--label">标签</div> <div class="field--items"> <div class="field--item"><a href="/tag/python" hreflang="zh-hans">python</a></div> <div class="field--item"><a href="/tag/pythonhanshu" hreflang="zh-hans">python函数</a></div> <div class="field--item"><a href="/tag/zifuchuanhanshu" hreflang="zh-hans">字符串函数</a></div> <div class="field--item"><a href="/tag/pythonzifuchuan" hreflang="zh-hans">python字符串</a></div> <div class="field--item"><a href="/tag/input" hreflang="zh-hans">input</a></div> </div> </div> Tue, 07 Apr 2020 11:41:37 +0000 和自甴很熟 3554783 at https://www.e-learn.cn 《自拍教程55》Python_批量验证1000个apk(附练手素材) https://www.e-learn.cn/topic/3554723 <span>《自拍教程55》Python_批量验证1000个apk(附练手素材)</span> <span><span lang="" about="/user/155" typeof="schema:Person" property="schema:name" datatype="">和自甴很熟</span></span> <span>2020-04-07 19:22:07</span> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"> <blockquote> <p>接上一篇案例:<a href="https://www.zipython.com/#/detail?id=32fc6017b5e14784a862c95367967ebd" title="Python_批量下载1000个apk" rel="nofollow">Python_批量下载1000个apk</a>,我们只讲了如何下载,<br /> 其实市场部提供的表格,不仅仅包含了apk的下载地址,还有apk的版本号,还有MD5信息等,<br /> 如何确保你下载的这1000个apk,是下载过程中未出错,版本号对的上,MD5信息也对上?<br /> 附:市场部提供的包含apk版本号,md5信息的表。<br /><img alt="" class="b-lazy" data-src="https://imgconvert.csdnimg.cn/aHR0cDovL3d3dy56aXB5dGhvbi5jb20vaW1hZ2VzL3RoaW5rL2FwcC92ZXJzaW9ubWQ1LmpwZw?x-oss-process=image/format,png" data-original="https://imgconvert.csdnimg.cn/aHR0cDovL3d3dy56aXB5dGhvbi5jb20vaW1hZ2VzL3RoaW5rL2FwcC92ZXJzaW9ubWQ1LmpwZw?x-oss-process=image/format,png" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><br /> 本案例主要介绍:如何快速地实现对已经下载好的app进行批量地验证。</p> </blockquote> <br /><h5 id="准备阶段">准备阶段</h5> <ol><li>本篇只讲验证apk的版本号与md5信息,不讲下载。</li> <li>需要确保aapt已经成功地加入到了环境变量中去</li> <li>“aapt dump bagding XXX.apk | findstr version”命令可以解析某个apk的versionName信息。</li> <li>Windows操作系统可以用“certutil -hashfile XXX.apk MD5”命令可以计算某apk的MD5哈希值,<br /> MD5是用于验证文件下载过程完整性的常用的一套计算方法,确保被下载的文件,在网络传输过程中,未被篡改或者损坏。</li> <li>Linux操作系统可以用“md5sum XXX.apk”命令来计算某个apk的MD5哈希值。</li> <li>其实Python的hashlib模块,也可以进行MD5哈希值的计算,可不受操作系统影响。</li> <li>上一篇案例,我们已经下载好了的apk是放在“downloaded_apk”文件下,os.listdir()函数可以列出文件夹下的所有apk文件。</li> <li>涉及Excel读写操作,依旧推荐openpyxl, 需要考虑与原始Excel上的版本号及MD5值自动做对比,<br /> 所以我们增加了2列用于做验证对比, 如果值相同,我们回填Ok,如果值不相同,我们回填差异值并标记红底色。<br /><img alt="" class="b-lazy" data-src="https://imgconvert.csdnimg.cn/aHR0cDovL3d3dy56aXB5dGhvbi5jb20vaW1hZ2VzL3RoaW5rL2FwcC9hcGt2ZXJpZnkuanBn?x-oss-process=image/format,png" data-original="https://imgconvert.csdnimg.cn/aHR0cDovL3d3dy56aXB5dGhvbi5jb20vaW1hZ2VzL3RoaW5rL2FwcC9hcGt2ZXJpZnkuanBn?x-oss-process=image/format,png" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /></li> </ol><br /><h5 id="python批处理脚本形式">Python批处理脚本形式</h5> <p>记住批处理脚本的精髓:批量顺序执行语句</p> <pre># coding=utf-8 import os import re import openpyxl from openpyxl.styles import PatternFill # 第一步:再生成整个excel表格的字典,key是apk中文名称,value是一个列表[所在行数, 版本号,MD5] print("正在生成apk信息索引字典...") apkinfo_dict = {} apkname_col = 2 apkversion_col = 4 apkmd5_col = 6 apkversion_col_newadd = 5 # 新加的版本验证列 apkmd5_col_newadd = 7 # 新加的MD5验证列 error_fill = PatternFill(fill_type='solid', fgColor="FF3300") # 标记红色底色 excel = openpyxl.load_workbook('Top_1000_apks.xlsx') # 读取excel里边的内容 table = excel.active rows = table.max_row for r in range(2, rows + 1): # 跟excel的第一行标题行无关,从第二行文字内容开始做替换工作 apk_name = table.cell(row=r, column=apkname_col).value # 获取apk名称 apk_version = table.cell(row=r, column=apkversion_col).value # 获取apk名称 apk_md5 = table.cell(row=r, column=apkmd5_col).value # 获取apk名称 apkinfo_dict[apk_name] = [r, apk_version, apk_md5] print(apkinfo_dict) # 第二步:再读取downloaded_apk文件夹下的所有文件,并进行对比及回填操作 curpath = os.getcwd() apk_dir = os.path.join(curpath, "downloaded_apk") apk_list = os.listdir(apk_dir) for apk in apk_list: print("正在进行%s的版本和MD5值对比与回填操作..." % apk) apk_path = os.path.join(apk_dir, apk) file_name = apk.replace(".apk", "") # 获取apk文件名,去掉后缀 s1 = os.popen("aapt.exe dump badging %s | findstr version" % apk_path).read() version_name = re.findall(r"versionName=\'(.*)\'", s1)[0] print(version_name) s2 = os.popen("certutil -hashfile %s MD5" % apk_path).read() md5_value = s2.splitlines()[1] md5_value = md5_value.replace(" ", "") print(md5_value) r = apkinfo_dict[file_name][0] # 获得该apk所在行号 # 假如版本号匹配的上,回填Ok,假如匹配不上,回填新的版本号 if version_name == apkinfo_dict[file_name][1]: table.cell(row=r, column=apkversion_col_newadd).value = "OK" else: table.cell(row=r, column=apkversion_col_newadd).value = version_name table.cell(row=r, column=apkversion_col_newadd).fill = error_fill # 标记红色底色 # 假如MD5匹配的上,回填Ok,假如匹配不上,回填新的MD5 if md5_value == apkinfo_dict[file_name][2]: table.cell(row=r, column=apkmd5_col_newadd).value = "OK" else: table.cell(row=r, column=apkmd5_col_newadd).value = md5_value table.cell(row=r, column=apkmd5_col_newadd).fill = error_fill # 标记红色底色 print("对比及回填结束,并保存到了New_Top_1000_apks.xlsx,请查阅...") excel.save("New_Top_1000_apks.xlsx") os.system("pause") </pre> <br /><h5 id="python面向过程函数形式">Python面向过程函数形式</h5> <p>面向过程函数的编程思维应该是这样的:<br /> 你需要多少个功能(函数),才能做成这个事,<br /> 最好把功能(函数)都尽量封装好,只暴露一些的参数接口即可。<br /> 在命令行工具熟练运用后,就可以考虑尽量用Python模块来实现命令行工具的功能,<br /> 比如certutil或md5sum就尽量不用了,而考虑用hashlib模块来代替,<br /> 减少对某个命令行工具的依赖,这样可移植性更强些(减少了对操作系统的限制)。</p> <pre># coding=utf-8 import os import re import openpyxl from openpyxl.styles import PatternFill import hashlib # 定义一些本模块(当前.py文件)可能都需要调用的“全局变量” apkname_col = 2 apkversion_col = 4 apkmd5_col = 6 apkversion_col_newadd = 5 # 新加的版本验证列 apkmd5_col_newadd = 7 # 新加的MD5验证列 error_fill = PatternFill(fill_type='solid', fgColor="FF3300") # 标记红色底色 def parse_apk_excel(excel_file): '''用于生成apk信息索引字典''' print("正在生成apk信息索引字典...") apk_info_dict = {} excel = openpyxl.load_workbook(excel_file) # 读取excel里边的内容 table = excel.active rows = table.max_row for r in range(2, rows + 1): # 跟excel的第一行标题行无关,从第二行文字内容开始做替换工作 apk_name = table.cell(row=r, column=apkname_col).value # 获取apk名称 apk_version = table.cell(row=r, column=apkversion_col).value # 获取apk名称 apk_md5 = table.cell(row=r, column=apkmd5_col).value # 获取apk名称 apk_info_dict[apk_name] = [r, apk_version, apk_md5] return apk_info_dict, excel, table def get_apk_version(apk_path): s = os.popen("aapt.exe dump badging %s | findstr version" % apk_path).read() version_name = re.findall(r"versionName=\'(.*)\'", s)[0] print(version_name) return version_name def get_apk_md5(apk_path): with open(apk_path, "rb") as hf: apk_md5 = hashlib.md5(hf.read()).hexdigest() print(apk_md5) return apk_md5 def compare_rewrite(apk_info_dict, excel, table): curpath = os.getcwd() apk_dir = os.path.join(curpath, "downloaded_apk") apk_list = os.listdir(apk_dir) for apk in apk_list: print("正在进行%s的版本和MD5值对比与回填操作..." % apk) file_name = apk.replace(".apk", "") # 获取apk文件名,去掉后缀 apk_path = os.path.join(apk_dir, apk) version_name = get_apk_version(apk_path) md5_value = get_apk_md5(apk_path) r = apk_info_dict[file_name][0] # 获得该apk所在行号 # 假如版本号匹配的上,回填Ok,假如匹配不上,回填新的版本号 if version_name == apk_info_dict[file_name][1]: table.cell(row=r, column=apkversion_col_newadd).value = "OK" else: table.cell(row=r, column=apkversion_col_newadd).value = version_name table.cell(row=r, column=apkversion_col_newadd).fill = error_fill # 标记红色底色 # 假如MD5匹配的上,回填Ok,假如匹配不上,回填新的MD5 if md5_value == apk_info_dict[file_name][2]: table.cell(row=r, column=apkmd5_col_newadd).value = "OK" else: table.cell(row=r, column=apkmd5_col_newadd).value = md5_value table.cell(row=r, column=apkmd5_col_newadd).fill = error_fill # 标记红色底色 print("对比及回填结束,并保存到了New_Top_1000_apks.xlsx,请查阅...") excel.save("New_Top_1000_apks.xlsx") apk_info_dict, excel, table = parse_apk_excel("Top_1000_apks.xlsx") # 获取索引字典 compare_rewrite(apk_info_dict, excel, table) # 开始对比及回填 os.system("pause") </pre> <br /><h5 id="python面向对象类形式">Python面向对象类形式</h5> <p>面向对象类的编程思维应该是这样的:<br /> 如果给你一个空白的世界,在这个世界里你需要哪些种类的事物,<br /> 这些种类的事物都具备哪些共有的属性与方法,<br /> 这些种类(类)的事物(对象),和其他种类(其他类)的事物(其他对象)有什么关系。<br /> 尽量把这些类封装好,只暴露对外的属性(变量)和方法(函数)即可。</p> <pre># coding=utf-8 import os import re import openpyxl from openpyxl.styles import PatternFill import hashlib # 定义一些本模块(当前.py文件)可能都需要调用的“全局变量” apkname_col = 2 apkversion_col = 4 apkmd5_col = 6 apkversion_col_newadd = 5 # 新加的版本验证列 apkmd5_col_newadd = 7 # 新加的MD5验证列 error_fill = PatternFill(fill_type='solid', fgColor="FF3300") # 标记红色底色 class ExcelParser(): def __init__(self, excel_file): self._excel_file = excel_file # 没必要暴露到外界,加_ def parse_apk_excel(self): # 这是需要暴露的方法(函数),不能加_ '''用于生成apk信息索引字典''' print("正在生成apk信息索引字典...") apk_info_dict = {} excel = openpyxl.load_workbook(self._excel_file) # 读取excel里边的内容 table = excel.active rows = table.max_row for r in range(2, rows + 1): # 跟excel的第一行标题行无关,从第二行文字内容开始做替换工作 apk_name = table.cell(row=r, column=apkname_col).value # 获取apk名称 apk_version = table.cell(row=r, column=apkversion_col).value # 获取apk名称 apk_md5 = table.cell(row=r, column=apkmd5_col).value # 获取apk名称 apk_info_dict[apk_name] = [r, apk_version, apk_md5] return apk_info_dict, excel, table def get_apk_version(apk_path): s = os.popen("aapt.exe dump badging %s | findstr version" % apk_path).read() version_name = re.findall(r"versionName=\'(.*)\'", s)[0] print(version_name) return version_name def get_apk_md5(apk_path): with open(apk_path, "rb") as hf: apk_md5 = hashlib.md5(hf.read()).hexdigest() print(apk_md5) return apk_md5 def compare_rewrite(apk_info_dict, excel, table): curpath = os.getcwd() apk_dir = os.path.join(curpath, "downloaded_apk") apk_list = os.listdir(apk_dir) for apk in apk_list: print("正在进行%s的版本和MD5值对比与回填操作..." % apk) file_name = apk.replace(".apk", "") # 获取apk文件名,去掉后缀 apk_path = os.path.join(apk_dir, apk) version_name = get_apk_version(apk_path) md5_value = get_apk_md5(apk_path) r = apk_info_dict[file_name][0] # 获得该apk所在行号 # 假如版本号匹配的上,回填Ok,假如匹配不上,回填新的版本号 if version_name == apk_info_dict[file_name][1]: table.cell(row=r, column=apkversion_col_newadd).value = "OK" else: table.cell(row=r, column=apkversion_col_newadd).value = version_name table.cell(row=r, column=apkversion_col_newadd).fill = error_fill # 标记红色底色 # 假如MD5匹配的上,回填Ok,假如匹配不上,回填新的MD5 if md5_value == apk_info_dict[file_name][2]: table.cell(row=r, column=apkmd5_col_newadd).value = "OK" else: table.cell(row=r, column=apkmd5_col_newadd).value = md5_value table.cell(row=r, column=apkmd5_col_newadd).fill = error_fill # 标记红色底色 print("对比及回填结束,并保存到了New_Top_1000_apks.xlsx,请查阅...") excel.save("New_Top_1000_apks.xlsx") if __name__ == '__main__': e_obj = ExcelParser("Top_1000_apks.xlsx") apk_info_dict, excel, table = e_obj.parse_apk_excel() # 获取索引字典 compare_rewrite(apk_info_dict, excel, table) # 开始对比及回填 os.system("pause") </pre> <br /><h5 id="本案例练手素材下载">本案例练手素材下载</h5> <p><a href="https://www.zipython.com/#/detail?id=f13a1efe25424b679e663a63fb64a10c" rel="nofollow">跳转到自拍教程官网下载素材</a><br /> 武散人出品,请放心下载并使用!<br /><br /></p> <h5 id="运行方式与效果">运行方式与效果</h5> <p>确保Android设备通过USB线与电脑连接了,adb设备有效连接,<br /> 以上代码的3种实现形式都可以直接运行,比如保存为verify_apks.py并和downloaded_apk文件夹还有Top_1000_apks.xlsx放在同一个文件夹下,<br /> 建议python verify_apks.py运行,当然也可以双击运行。<br /> 运行效果如下:<br /><img alt="" class="b-lazy" data-src="https://imgconvert.csdnimg.cn/aHR0cDovL3d3dy56aXB5dGhvbi5jb20vaW1hZ2VzL3RoaW5rL2FwcC92ZXJpZnlfYXBrLmpwZw?x-oss-process=image/format,png" data-original="https://imgconvert.csdnimg.cn/aHR0cDovL3d3dy56aXB5dGhvbi5jb20vaW1hZ2VzL3RoaW5rL2FwcC92ZXJpZnlfYXBrLmpwZw?x-oss-process=image/format,png" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><br /> 最终会新生成一个New_Top_1000_apks.xlsx, 其验证及回填效果如下,<br /> 红色的是代表实际下载下来的apk与市场部提供的Excel上的版本信息及Md5不一样的标注。<br /><img alt="" class="b-lazy" data-src="https://imgconvert.csdnimg.cn/aHR0cDovL3d3dy56aXB5dGhvbi5jb20vaW1hZ2VzL3RoaW5rL2FwcC9yZXdyaXRlLmpwZw?x-oss-process=image/format,png" data-original="https://imgconvert.csdnimg.cn/aHR0cDovL3d3dy56aXB5dGhvbi5jb20vaW1hZ2VzL3RoaW5rL2FwcC9yZXdyaXRlLmpwZw?x-oss-process=image/format,png" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><br /><br /></p> <p>更多更好的原创文章,请访问官方网站:<a href="https://www.zipython.com">www.zipython.com</a><br /> 自拍教程(自动化测试Python教程,武散人编著)<br /> 原文链接:<a href="https://www.zipython.com/#/detail?id=f13a1efe25424b679e663a63fb64a10c" rel="nofollow">https://www.zipython.com/#/detail?id=f13a1efe25424b679e663a63fb64a10c</a><br /> 也可关注“武散人”微信订阅号,随时接受文章推送。<br /><img alt="" class="b-lazy" data-src="https://imgconvert.csdnimg.cn/aHR0cDovL3d3dy56aXB5dGhvbi5jb20vaW1hZ2VzL3dlY2hhdC5wbmc?x-oss-process=image/format,png" data-original="https://imgconvert.csdnimg.cn/aHR0cDovL3d3dy56aXB5dGhvbi5jb20vaW1hZ2VzL3dlY2hhdC5wbmc?x-oss-process=image/format,png" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /></p> <div class="alert alert-success" role="alert"><p>来源:<code>https://www.cnblogs.com/zipython/p/12655033.html</code></p></div></div> <div class="field field--name-field-tags field--type-entity-reference field--label-above"> <div class="field--label">标签</div> <div class="field--items"> <div class="field--item"><a href="/tag/pythonhanshu" hreflang="zh-hans">python函数</a></div> <div class="field--item"><a href="/tag/info" hreflang="zh-hans">info</a></div> <div class="field--item"><a href="/tag/python" hreflang="zh-hans">python</a></div> <div class="field--item"><a href="/tag/table" hreflang="zh-hans">table</a></div> </div> </div> Tue, 07 Apr 2020 11:22:07 +0000 和自甴很熟 3554723 at https://www.e-learn.cn