python人工智能教学(精选4篇)
2017浙商人工智能峰会于6月8日在杭州举行。峰会上,全国政协常委、外事委员会主任,中国工程院原常务副院长潘云鹤院士以“人工智能2.0”为主题,深入分析了人工智能现状,预测了未来发展趋势。
2011年至今,谷歌、微软、英特尔、苹果等巨头已累计收购140余家AI领域的创业公司。谷歌2014年以4亿英镑的高价收购DeepMind公司,研制的AlphaGo于2016年战胜围棋世界冠军。中国的百度公司、华为公司也在紧紧跟上,这些都令人工智能受到全球产业界、学界乃至全社会的热议。
“目前,中国人工智能正在进入2.0时代。”潘云鹤分析称,其技术特征表现为:从传统知识表达技术到大数据驱动知识学习,转向大数据驱动和知识指导相结合的方式;从分类型处理视觉、听觉、文字等多媒体数据,迈向跨媒体协同认知、学习和推理的新水平;从追求“智能机器”到高水平的人机协同融合,走向混合型增强智能的新计算形态;从聚焦研究“个体智能”到基于互联网的群体智能,形成在网上激发组织集体智能的技术与平台;从拟人化的机器人转向更加广阔的自主智能系统,从而促进改造各种机械、装备和产品,走上智能化之路。
这两年,大量资本涌入加速了我国人工智能技术与应用的结合。但在潘云鹤看来,这一轮的人工智能与60年前人工智能概念提出来的时候是不一样的,首先是企业开始进入,“未来,人工智能介入的产业规模将非常巨大,因为它是将现有的信息产业向前推进。”
而作为人工智能最佳编程语言,Python崛起势不可挡。Python诞生于1989年,第一个公开版本于1991年问世。作为一门历史悠久的语言,Python具有代码简短、可读性强等先天优势,上海Python培训比R更具有通用性,比C更灵活,比Java拥有更好的生态系统,可以说Python是一个很全面的语言,尤其是在数据科学、机器学习和AI方面,有着非常出色的表现。
Python支持结构化程序设计, 在最初的程序学习中, 完全可以使用简约的python代码实现结构化的程序学习, 几乎没有难度。Python可以轻易的调用DLL文件来扩展功能, 实际编程工作中可以使用它快速的编制程序基本框架, 然后相关模块采用C或C++等来进行编制。其类库十分强大易用, 而且完全开源。
2 在网络基础课程中的运用
很多传统计算机课程除了编程语言的学习之外, 基本上都是纯粹理论性的。我们可以通过学期初简单的python学习 (2-3周) , 根据相关课程的特色实地编写一些小程序来实践计算机相关理论知识。比如计算机网络课程, 可以编写一个最简单的C/S结构的python小程序来分别实践TCP、UDP两种协议的不同执行效果, 让学生对建立连接和无连接产生真实的感受, 从而较深入的理解两种主要的通信协议的异同;
Python服务器端代码书写
执行客户端代码, 服务器端效果如下:[127.0.0.1:54091]connected
我们可以得出结论:TCP协议要求网络帧数据必须先建立连接, 实现3次握手协议, 当连接建立后, 方能进行数据的传输, 而数据传输结束后需断开连接。因此常应用于对数据传输安全要求高的行业。下面是UDP的例子:
Python服务器端代码
同上, 在服务器端运行该段代码。
python客户端代码:
UDP由于不需要对帧数据包进行判断也不需要保持网络的持续连接, 实行先到先得的发送方式, 因此网络的响应速度更快。
仅需要数十行代码, 即可立即验证TCP与UDP的区别, 学生同时掌握了网络协议的区别、python的网络编程两方面的信息, 对培养学生的学习热情和夯实基础起到很大作用。
参考文献
[1][法]Tarek Ziade, 著, 姚军, 夏海轮, 王秀丽, 译.《Python高级编程》.[1][法]Tarek Ziade, 著, 姚军, 夏海轮, 王秀丽, 译.《Python高级编程》.
【关键词】裂纹扩展,Python,扩展有限元。
【中图分类号】TJ06 【文献标识码】A 【文章编号】1672-5158(2013)03-0052-01
对于裂纹的扩展研究,主要从微观到宏观角度的出发,固体材料从变形到破坏,跨越了原子结构到宏观的9至11个尺度量级。裂纹尖端很小的区域内的应力、应变都是影响裂纹扩展的主要因素。因此从研究范围来看,跨尺度的宏细观研究相结合,正成为断裂力学研究方向。裂纹尖端区域内的微观上结构组织发生的变化和影响是当前断裂力学的研究前沿课题。从细观和宏观尺度上,研究各种材料的断裂、损伤、蠕变和腐蚀疲劳等方面的最新理论、实验研究方法及其工程应用。
1 python与ABAQUS运算方法
1.1 python汇编语言简介
Python语言是一种动态解释型编程语言,1989年由Guido van Rossum开发,并于1991年年初发表。Python语言功能强大、简单易学,支持面向对象编程(object-oriented programming),已逐渐受到越来越多的用于的关注。
Python语言主要有如下重要特征:
(1) 面向对象性(2)简单性(3)健壮性(4)可扩展性(5)动态性(6)内置的数据结构(7)跨平台性(8)强类型
1.2 python与ABAQUS运算方法
Abaqus脚本接口可以实现Abaqus/CAE中的所有功能,并在Python语言的基础上又扩展了一些新的对象类型。这些对象间的层次和关系组成了Abaqus 的对象模型。
Abaqus脚本接口对Python 语言进行了扩展,额外提供了大约500个对象模型,这些对象模型之间的关系比较复杂,大致将这写对象分为3 类:Session、Mdb 和Odb。如图1 所示
(3)
右端第一项可用于模型中所有节点;右端第二项只对形函数被裂纹内部切开的单元节点有效;右端第三项只对形函数被裂纹尖端切开的单元节点有效。
3.算例
3.1 模型建立及运算
以CT试件裂纹扩展为例,用python编程做裂纹扩展。主要分为以下几个步骤
(1)from part import * #第一步,建立建模
(2)from material import * #第二步,材料定义
编译完CT试件模型后对其进行材料的定义,使用缩减积分单元,材料为高强钢,其屈服强度为714MPa,抗拉强度844MPa。在程序中定义极限强度准则如下:
mdb.models['Model-1'].materials['Q690']. Maxps Damage Initiation(table=((844,),))
并定义其损伤和断裂准则,它是根据指数形式来定义的。
(3)from assembly import * #第三步,装配
(4)from mesh import * #第四步,网格划分控制
为了能画出整齐的网格,在画网格之前,先把试件分隔成块,并对其进行单独网格设置,网格的边缘不能与之前画的裂纹重合。
(5)from interaction import * #第五步,定义相互接触
该步骤主要用于定义裂纹和板件接触的定义,并定义试件孔与孔圆心耦合,以便于施加载荷。
(6)from step import * #第六步,定义分析步
步骤中定义静力加载,并定义输出,主要输出内容如下:
mdb.models['Model-1'].fieldOutputRequests['F-Output-1'].setValues(va riables=( 'S','LE','U','RF','PHILSM','STATUSXFEM'))。
(7)from load import * #第七步,载荷边界定义
运算选用位移载荷,在上孔加载,下孔约束。
(8)计算任务生成并提交计算。
3.2. 运算结果与分析
提交完由Abaqus进行运算,其某一时刻的裂纹扩展云图如图2所示,图中可以看出网格整齐,基本为正方形网格,单元在内部开裂,裂纹沿着最大主应力方向扩展,其应变能随时间变化的曲线如图3所示。
图2 裂纹扩展云图 图3 应变能随时间变化曲线
参考文献:.
[1] 刘长虹,李洪升,彭军. 基于XFEM的裂纹扩展分析[J]. 上海工程科学技术大学学报,2010,24(3) : 218-220.
[2] 曹金凤. Python语言在Abaqus中的应用[M]. 北京:机械工业出版社,2011.8: 13-173
两种方式交互式和直接python xxx.py虽然有所不同,但最终归于一处,就是启动虚拟机执行python字节码。这里以python xxx.py方式为例,在运行python程序之前,需要对源文件编译成字节码,创建PyCodeObject对象。这个是通过PyAST_Compile函数实现的,至于具体编译流程,这就要参看《编译原理》那本龙书了,这里暂时当做黑盒好了,因为单就编译这部分而言,一时半会也说不清楚(好吧,其实是我也没有学好编译原理)。编译后得到PyCodeObject对象,然后调用PyEval_EvalCode(co, globals, locals)函数创建PyFrameObject对象并执行字节码了。注意到参数里面的co是PyCodeObject对象,而由于运行PyEval_EvalCode时创建的栈帧对象是Python创建的第一个PyFrameObject对象,所以f_back为NULL,而且它的globals和locals就是__main__模块的字典对象。如果我们不是直接运行,而是导入一个模块的话,则还会将python源码编译后得到的PyCodeObject对象保存到pyc文件中,下次加载模块时如果这个模块没有改动过就可以直接从pyc文件中读取内容而不需要再次编译了。
执行字节码的过程就是模拟CPU执行指令的过程一样,先指向PyFrameObject的f_code字段对应的PyCodeObject对象的co_code字段,这就是字节码存储的位置,然后取出第一条指令,接着第二条指令…依次执行完所有的指令。python中指令长度为1个字节或者3个字节,其中无参数的指令长度是1个字节,有参数的指令长度是3个字节(指令1字节+参数2字节)。
python虚拟机的进程,线程,栈帧对象等关系如下图所示:
2 Python程序运行实例说明
程序猿学习一门新的语言往往都是从hello world开始的,一来就跟世界打个招呼,因为接下来就要去面对程序语言未知的世界了。我学习python也是从这里开始的,只是以前并不去深究它的执行原理,这回是逃不过去了。看看下面的栗子。
#示例代码test3.pyi = 1s = ‘hello world‘def test(): k = 5 print k print sif __name__ == “__main__”: test()
这个例子代码不多,不过也涉及到python运行原理的方方面面(除了类机制那一块外,类机制那一块还没有理清楚,先不理会)。那么按照之前部分说的,执行python test3.py的时候,会先初始化python进程和线程,然后初始化系统模块以及类型系统等,然后运行python程序test3.py。每次运行python程序都是开启一个python虚拟机,由于是直接运行,需要先编译为字节码格式,得到PyCodeObject对象,然后从字节码对象的第一条指令开始执行。因为是直接运行,所以PyCodeObject也就没有序列化到pyc文件保存了。下面可以看下test3.py的PyCodeObject,使用python的dis模块可以看到字节码指令。
In [1]: source = open(‘test3.py‘).read()In [2]: co = compile(source, ‘test3.py‘, ‘exec‘)In [3]: co.co_constsOut[3]: (1, ‘hello world‘,, ‘__main__‘, None)In [4]: co.co_namesOut[4]: (‘i‘, ‘s‘, ‘test‘, ‘__name__‘)In [5]: dis.dis(co) ##模块本身的字节码,下面说的整数,字符串等都是指python中的对象,对应PyIntObject,PyStringObject等。 1 0 LOAD_CONST 0 (1) # 加载常量表中的第0个常量也就是整数1到栈中。 3 STORE_NAME 0 (i) # 获取变量名i,出栈刚刚加载的整数1,然后存储变量名和整数1到f->f_locals中,这个字段对应着查找名字时的local名字空间。 2 6 LOAD_CONST 1 (‘hello world‘) 9 STORE_NAME 1 (s) #同理,获取变量名s,出栈刚刚加载的字符串hello world,并存储变量名和字符串hello world的对应关系到local名字空间。 4 12 LOAD_CONST 2 () 15 MAKE_FUNCTION0 #出栈刚刚入栈的函数test的PyCodeObject对象,以code object和PyFrameObject的f_globals为参数创建函数对象PyFunctionObject并入栈 18 STORE_NAME 2 (test) #获取变量test,并出栈刚入栈的PyFunctionObject对象,并存储到local名字空间。 9 21 LOAD_NAME 3 (__name__) ##LOAD_NAME会先依次搜索local,global,builtin名字空间,当然我们这里是在local名字空间能找到__name__。 24 LOAD_CONST 3 (‘__main__‘) 27 COMPARE_OP 2 (==) ##比较指令 30 JUMP_IF_FALSE 11 (to 44) ##如果不相等则直接跳转到44对应的指令处,也就是下面的POP_TOP。因为在COMPARE_OP指令中,会设置栈顶为比较的结果,所以需要出栈这个比较结果。当然我们这里是相等,所以接着往下执行33处的指令,也是POP_TOP。 33 POP_TOP 10 34 LOAD_NAME 2 (test) ##加载函数对象 37 CALL_FUNCTION0 ##调用函数 40 POP_TOP ##出栈函数返回值 41 JUMP_FORWARD 1 (to 45) ##前进1步,注意是下一条指令地址+1,也就是44+1=45 >>44 POP_TOP >>45 LOAD_CONST 4 (None) 48 RETURN_VALUE #返回NoneIn [6]: dis.dis(co.co_consts[2]) ##查看函数test的字节码 5 0 LOAD_CONST 1 (5) 3 STORE_FAST 0 (k) #STORE_FAST与STORE_NAME不同,它是存储到PyFrameObject的f_localsplus中,不是local名字空间。 6 6 LOAD_FAST 0 (k) #相对应的,LOAD_FAST是从f_localsplus取值 9 PRINT_ITEM 10 PRINT_NEWLINE #打印输出 7 11 LOAD_GLOBAL 0 (s) #因为函数没有使用local名字空间,所以,这里不是LOAD_NAME,而是LOAD_GLOBAL,不要被名字迷惑,它实际上会依次搜索global,builtin名字空间。 14 PRINT_ITEM 15 PRINT_NEWLINE 16 LOAD_CONST 0 (None) 19 RETURN_VALUE
按照我们前面的分析,test3.py这个文件编译后其实对应2个PyCodeObject,一个是本身test3.py这个模块整体的PyCodeObject,另外一个则是函数test对应的PyCodeObject。根据PyCodeObject的结构,我们可以知道test3.py字节码中常量co_consts有5个,分别是整数1,字符串‘hello world’,函数test对应的PyCodeObject对象,字符串__main__,以及模块返回值None对象。恩,从这里可以发现,其实模块也是有返回值的。我们同样可以用dis模块查看函数test的字节码。
关于字节码指令,代码中做了解析。需要注意到函数中局部变量如k的取值用的是LOAD_FAST,即直接从PyFrameObject的f_localsplus字段取,而不是LOAD_NAME那样依次从local,global以及builtin查找,这是函数的特性决定的。函数的运行时栈也是位于f_localsplus对应的那片内存中,只是前面一部分用于存储函数参数和局部变量,而后面那部分才是运行时栈使用,这样逻辑上运行时栈和函数参数以及局部变量是分离的,虽然物理上它们是连在一起的。需要注意的是,python中使用了预测指令机制,比如COMPARE_OP经常跟JUMP_IF_FALSE或JUMP_IF_TRUE成对出现,所以如果COMPARE_OP的下一条指令正好是JUNP_IF_FALSE,则可以直接跳转到对应代码处执行,提高一定效率。
此外,还要知道在运行test3.py的时候,模块的test3.py栈帧对象中的f_locals和f_globals的值是一样的,都是__main__模块的字典。在test3.py的代码后面加上如下代码可以验证这个猜想。
... #test3.py的代码if __name__ == “__main__”: test() print locals() == sys.modules[‘__main__‘].__dict__ # True print globals() == sys.modules[‘__main__‘].__dict__ # True print globals() == locals() # True
正式因为如此,所以python中函数定义顺序是无关的,不需要跟C语言那样在调用函数前先声明函数。比如下面test4.py是完全正常的代码,函数定义顺序不影响函数调用,因为在执行def语句的时候,会执行MAKE_FUNCTION指令将函数对象加入到local名字空间,而local和global此时对应的是同一个字典,所以也相当于加入了global名字空间,从而在运行函数g的时候是可以找到函数f的。另外也可以注意到,函数声明和实现其实是分离的,声明的字节码指令在模块的PyCodeObject中执行,而实现的字节码指令则是在函数自己的PyCodeObject中。
【python人工智能教学】推荐阅读:
python是什么语言11-19
python选择排序算法实例总结10-06
Python中的hypot方法使用简介11-19
人工智能基础教学09-16
人工智能和教师教学07-07
《人工智能》教学讲座②:机器智能11-21
人工智能感想11-28
人工智能安全问题09-10
人工智能发展英语09-13