python人工智能原理、实践及应用
- 第一章 概述
- 第二章 Python编程语言
- 4. 编程程序实现随机密码生成。要求在 26 个字母的大小写和 9 个数字组成的列表中随机生成 10 个 8 位密码
- 第三章
- 第五章
- 第六章 TensorFlow深度学习
- 1. 请举例目前人工智能领域有哪些开源的深度学习开源框架?TensorFlow 与这些开源框架比较起来,有哪些优点?
- 2.为什么说 Python 是一门适合开发人工智能应用的程序语言?与 C、Java 等程序开发语言相比,Python 的主要优点是什么?
- 3.请问 TensorFlow 中的 session 是做什么用的?为什么需要 session?
- 4.请用画图工具(工具不限)画出 TensorFlow 进行模型设计和训练的基本流程图。
- 5.TensorFlow 是一种“符号式编程框架”,首先要构造一个图(graph),然后在会话(Session)上根据这个图做真实的运算(op),请思考一下,有这个图(graph)后给整个系统开发会带来哪些帮助?
- 6. 深度学习是基于数据驱动的人工智能机器学习,可以学习样本数据的内在规律和表示层次,请问如何搜集、制作和划分自己模型所需要的训练集、验证集?
- 第七章 数据采集与数据制作
- 第八章 GPU并行计算与CUDA编程
视频:B站杨博雄老师课程
标准答案来自于杨博雄老师的课后题答案。
第一章 概述
1. 什么是人工智能?人工智能的意义和目标是什么?
人工智能是能够感知、推理、行动和适应的程序。
人工智能的意义和目标是解放人类劳动,使机器能向人一样思考或劳动。
课程标准答案
人工智能(Artificial Intelligence),英文缩写为AI。它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。人工智能是计算机科学的一个分支,它企图了解智能的实质,并生产出一种新的能以人类智能相似的方式作出反应的智能机器,该领域的研究包括机器人、语言识别、图像识别、自然语言处理和专家系统等。
人工智能是社会发展和技术创新的产物,是促进人类进步的重要技术形态。人工智能已经成为新一轮科技革命和产业变革的核心驱动力,正在对世界经济、社会进步和人民生活产生极其深刻的影响。对于世界经济,人工智能是引领未来的战略性技术,全球主要国家及地区都把发展人工智能作为提升国家竞争力、推动国家经济增长的重大战略。对于社会进步,人工智能技术为社会治理提供了全新的技术和思路,将人工智能运用于社会治理中,是降低治理成本、提升治理效率、减少治理干扰最直接、最有效的方式。对于日常生活,深度学习、图像识别、语音识别等人工智能技术已经广泛应用于智能终端、智能家居、移动支付等领域,未来人工智能技术还将在教育、医疗、出行等等与人民生活息息相关的领域里发挥更为显著的作用,为普通民众提供覆盖更广/体验感更优、便利性更佳的生活服务。
人工智能的一个主要目标是使计算机能够胜任一些通常需要人类智能才能完成的复杂工作,包括理解人类的知识、有效的自动化、有效的智能扩展、超人的治理、通用问题求解、连贯性的交谈、自治、学习、存储信息。
2. 驱动新一代人工智能发展与进步的关键因素有哪些?
算力,算法,数据,移动AI应用四大关键因素。
标准答案
驱动新一代人工智能发展与进步的关键因素有大数据的出现、算法的进步、GPU计算设备的普及以及各种基于移动的智能化创新应用。以深度学习(Deep Learning,DL)为代表的人工智能异军突起,在计算机视觉、自然语言处理等领域取得了很好的效果,成为主导新一轮人工智能发展的主力军。大数据(Big Data)的发展为深度学习注入了新的燃料,极大地提高了深度学习的智能水平。计算能力的提升促进了深度学习模型训练效率,成为推动新一代人工智能发展的主要驱动力。移动互联网与智能手机的结合为新一代人工智能插上腾飞的翅膀,产生了全新的应用,如语音购物、人脸支付、视频理解、自然语言处理、无人超市、自动驾驶等。
3. 人工智能有哪三大流派?各种流派有哪些特点和代表性研究成果?
1.符号主义流派。
特点:研究人的思维过程来模拟智能活动
代表成果:知识图谱
2.连接主义流派。
特点:神经元的连接产生智能
代表成果:神经网络
3.行为主义流派。
特点:模拟人在控制过程中的智能行为和作用
代表成果:机器人和机器狗
标准答案
人工智能在其学科发展的进程当中,有许多不同学科背景的学者都曾对人工智能做出过各自的理解,提出不同的观点,由此产生了不同的学术流派。这其中,对人工智能研究影响较大的主要有符号主义、连接主义和行为主义三大学派:
(1)符号主义(symbolicism),又称为逻辑主义(logicism)、心理学派(psychologism)或者计算机学派(computerism),其原理主要为物理符号系统(即符号操作系统)假设和有限合理性原理。
符号主义的发展大概经历了几个阶段:推理期(20世纪50年代-20世纪70年代),知识期(20世纪70年代-)。“推理期”人们基于符号知识表示、通过演绎推理技术取得了很大的成就;“知识期”人们基于符号表示、通过获取和利用领域知识来建立专家系统取得了大量的成果。
(2)连接主义(connectionism),又称为仿生学派(bionicsism)或生理学派(physiologism)。连接学派通过算法模拟神经元,并把这样一个单元叫做感知机,将多个感知机组成一层网络,多层这样的网络互相连接最终得到神经网络。
连接主义学派认为人工智能源于仿生学,特别是人脑模型的研究。连接主义学派从神经生理学和认知科学的研究成果出发,把人的智能归结为人脑的高层活动的结果,强调智能活动是由大量简单的单元通过复杂的相互连接后并行运行的结果。人类可以根据要解决的实际问题来构建神经网络,进而用数据不断训练这一网络,调整连接权重来模拟智能。20世纪60~70年代,连接主义,尤其是对以感知机(perceptron)为代表的脑模型的研究出现过热潮,由于受到当时的理论模型、生物原型和技术条件的限制,脑模型研究在20世纪70年代后期至80年代初期落入低潮。直到Hopfield教授在1982年和1984年发表两篇重要论文,提出用硬件模拟神经网络以后,连接主义才又重新抬头。1986年,鲁梅尔哈特(Rumelhart)等人提出多层网络中的反向传播算法(BP)算法。进入21世纪后,连接主义卷土重来,提出了“深度学习”的概念。
(3)行为主义(actionism),又称为进化主义(evolutionism)或控制学派(cyberneticsism),其原理为控制论及感知-动作型控制系统。
行为主义是20世纪末才以人工智能新学派的面孔出现的,引起许多人的兴趣。这一学派的代表作首推鲁克斯(Brooks)的六足行走机器人,它被看作新一代的“控制论动物”,是一个基于感知-动作模式的模拟昆虫行为的控制系统。
4. 新一代人工智能的关键技术有哪些?
1.机器学习
2.深度学习
3.大数据技术
4.计算机视觉
5.智能人机交互
6.知识图谱
7.GPU计算
8.自然语言理解
9.虚拟现实
标准答案
新一代人工智能的关键技术有:计算机视觉、自然语言处理、模式识别、问题求解、自然语言理解、逻辑推理和定理证明、专家系统、机器学习、机器人学、神经网络、智能控制、智能检索、智能调度与指挥、SLAM及时定位与构图、VR/AR/MR等虚拟现实、混合现实技术、分布式人工智能与Agent、计算智能与进化计算、数据挖掘与知识发现等。
第二章 Python编程语言
1. 编写 isprime() 函数,参数为整数,要有异常处理。函数功能是如果整数是质数,返回 True ,否则返回 False。
def isprime(data):
try:
for i in range(2, int(data)):
if int(data) % i == 0:
return False
else:
return True
except Exception as e:
print(e)
if __name__ == '__main__':
print("请输入整数")
data = input()
isp_rime = isprime(data)
print(isp_rime)
课程标准答案
#质数的判断函数实现:
def isPrime(n):
if n==1:
return False
for i in range(2,n//2+1):
if n%i==0:
return False
else:
return True
2. 编写程序实现最大公约数和最小公倍数计算。
print("输入两个整数,计算最大公约数,最小公倍数")
a = int(input())
b = int(input())
max_yueshu = 0
min_beishu = 0
for i in range(1, min(a, b)+1):
if a%i == 0 and b%i == 0 and i <= a and i <= b:
max_yueshu = i
for i in range(a*b, max(a, b)-1, -1):
if i%a == 0 and i%b == 0 and i >= a and i >= b:
min_beishu = i
print(max_yueshu)
print(min_beishu)
计算两个数的最大公约数(Greatest Common Divisor,简称GCD)和最小公倍数(Least Common Multiple,简称LCM)可以使用不同的方法,下面是常见的几种计算方法:
-
辗转相除法:也称为欧几里德算法,用于计算最大公约数。其基本思想是两个正整数的最大公约数等于其中较小的数和两数相除的余数的最大公约数。这个方法可以通过递归或循环实现。
-
质因数分解法:首先将两个数分解质因数,然后取它们的公共质因数相乘即可得到最大公约数;最小公倍数则是将两个数的所有质因数相乘,包含重复的质因数。
-
辗转相减法:也称为更相减损术,用于计算最小公倍数。其基本思想是两个正整数的最小公倍数等于两数的乘积除以它们的最大公约数。这个方法可以通过递归或循环实现。
以下是 Python 代码示例,分别使用辗转相除法和辗转相减法来计算最大公约数和最小公倍数:
# 辗转相除法计算最大公约数
def gcd(a, b):
while b:
a, b = b, a % b
return a
# 辗转相减法计算最小公倍数
def lcm(a, b):
return a * b // gcd(a, b)
# 示例用法
num1 = 12
num2 = 18
print("最大公约数:", gcd(num1, num2)) # 输出 6
print("最小公倍数:", lcm(num1, num2)) # 输出 36
这个代码中的 gcd()
函数用于计算最大公约数,lcm()
函数用于计算最小公倍数。通过调用这两个函数,可以得到两个数的最大公约数和最小公倍数。
课程标准答案
m,n = eval(input())
if m > n:
a,b = n, m
else:
a,b = m, n
while a!=0:
a,b = b % a, a
print('最大公约数{}'.format(b))
print('最小公倍数{}'.format(m*n//b)
3. 汉诺塔是一个数学难题,其问题描述为如何将所有圆盘从 A 盘借助 B 盘移动到 C 盘。请用 Python 编写程序实现汉诺塔的移动。要求输入汉诺塔的层数,输出整个移动的流程。
4. 编程程序实现随机密码生成。要求在 26 个字母的大小写和 9 个数字组成的列表中随机生成 10 个 8 位密码
import random
list_pw = []
for i in range(ord('a'), ord('z')+1):
# print(chr(i))
list_pw.append(chr(i))
for i in range(10):
list_pw.append(str(i))
for i in range(10):
random.shuffle(list_pw)
pw = ''.join(list_pw[:9])
print(pw)
课程标准答案
import random
random.seed(0x1010)
s="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!@#$%^&*"
ls = []
excludes = ""
while len(ls) < 10:
pwd = ""
for i in range(10):
pwd += s[random.randint(0, len(s)-1)]
if pwd[0] in excludes:
continue
else:
ls.append(pwd)
excludes += pwd[0]
print('生成的密码是:',pwd)
5. 参考单词练习系统,设计一个学生成绩管理系统。
第三章
第五章
1. 目前有哪些深度学习开源框架?试分别比较优缺点。
pytorch, tensorflow, mxnet, caffe, keras。
标准答案
深度学习框架的出现降低了入门的门槛,你不需要从复杂的神经网络开始编代码,你
可以根据需要选择已有的模型,通过训练得到模型参数,你也可以在已有模型的基础上增
加自己的 layer,或者是在顶端选择自己需要的分类器和优化算法(比如常用的梯度下降
法)。
2. 深度学习与神经网络之间有什么关联?
我们现在常说的深度学习,基本上都是指的神经网络模型。
标准答案
深度学习(Deep Learning)是机器学习(Machine Learning)研究中的一个新的领域,其
动机在于建立、模拟人脑进行分析学习的神经网络,它模仿人脑的机制来解释数据,例如图
像,声音和文本。 深度学习的概念源于人工神经网络的研究。含多隐层的多层感知器就
是一种深度学习结构。深度学习通过组合低层特征形成更加抽象的高层表示属性类别或特
征,以发现数据的分布式特征表示。
深度学习神经网络之间有相同的地方也有很多不同。二者的相同在于 deep learning 采用
了神经网络相似的分层结构,系统由包括输入层、隐层(多层)、输出层组成的多层网络,
只有相邻层节点之间有连接,同一层以及跨层节点之间相互无连接,每一层可以看作是一个
logistic regression 模型;这种分层结构,是比较接近人类大脑的结构的。
为了克服神经网络训练中的问题,深度学习采用了与神经网络很不同的训练机制。传
统神经网络中,采用的是后向传播 BP(back propagation)的方式进行,简单来讲就是采用
迭代的算法来训练整个网络,随机设定初值,计算当前网络的输出,然后根据当前输出和标
签之间的差去改变前面各层的参数,直到收敛(整体是一个梯度下降法)。而深度学习整体
上是一个分层(layer-wise)的训练机制。这样做的原因是因为,如果采用 BP 的机制,对于
一个深度学习(7 层以上),残差传播到最前面的层已经变得太小,出现所谓的梯度扩散
(gradient diffusion)。
3. 什么是激活函数?为什么神经网络需要激活?
激活函数是一些非线性函数。神经网络需要非线性函数来让模型达到非线性的效果【引入非线性】。
标准答案
所谓激活函数(Activation Function),就是在人工神经网络的神经元上运行的函数,负
责将神经元的输入映射到输出端。激活函数(Activation functions)对于人工神经网络模型
去学习、理解非常复杂和非线性的函数来说具有十分重要的作用。它们将非线性特性引入
到我们的网络中。在神经元中,输入的 inputs 通过加权求和后,还被作用了一个函数,这
个函数就是激活函数。引入激活函数是为了增加神经网络模型的非线性。没有激活函数的
每层都相当于矩阵相乘。就算你叠加了若干层之后,无非还是个矩阵相乘罢了。
如果不用激活函数,每一层输出都是上层输入的线性函数,无论神经网络有多少层,
输出都是输入的线性组合,这种情况就是最原始的感知机(Perceptron)。如果使用的话,
激活函数给神经元引入了非线性因素,使得神经网络可以任意逼近任何非线性函数,这样
神经网络就可以应用到众多的非线性模型中。
4. 什么是卷积神经网络?目前有哪些卷积神经网络模型?
能够做卷积计算的模型。VGGNET, AlexNet。
标准答案
卷积神经网络(Convolutional Neural Networks, CNN)是一类包含卷积计算且具有深度
结构的前馈神经网络(Feedforward Neural Networks),是深度学习(deep learning)的代表算
法之一。卷积神经网络具有表征学习(representation learning)能力,能够按其阶层结构对输
入信息进行平移不变分类(shift-invariant classification),因此也被称为“平移不变人工神经网
络(Shift-Invariant Artificial Neural Networks, SIANN)”。
常见的卷积神经网络主要有:
(1)LeNet 模型结构
LeNet 网络结构是再 1998 年由 lecun 提出的。它被创造出来的目的是解决手写数字识别
的问题。即它是一个 10 分类任务的解决办法。下图是它的一个基本的网络结构。
网络结构图中显示的很清楚。它包括了两个卷积层,两个下采样层,两个全连接层和一
个激活层,最后有一个 sotfmax 分类层。可以说,LeNet 麻雀虽小,五脏俱全。包括了基本
的卷积神经网络的所有单元。
(2)AlexNet
AlexNet 的网络结构如下:
可以看到,AlexNet 的网络结构被分成了两支,这是因为当时的 GPU 计算能力不够,显
存容量不够大。为了完成模型的训练,作者使用了两块显卡来进行分布式的训练。我们现在
想要训练这样一个模型,只需要实现其中一条就好了。对比 LeNet 可以发现从结构上来看,
它并没有很大的改变:输入层是 224* 224 的数据,然后进行了多轮卷积(提取特征),其中
包括 11* 11 的卷积核,5* 5 的卷积核,3* 3 的卷积核。虽然在图片上我们只画了卷积层,
但我们应该知道,每一个卷积层之后都会跟上一个激活层(用来增加模型的非线性表达能
力),一个降采样 pooling 层(减小数据量,提取主要特征),以及一个局部归一化处理(对
数据进行一定的约束,使我们的数据约束在一定的范围内,使网络更好的收敛)。经过多个
卷积层之后,就会有三个 fc 层(全连接层)。同样的,在每一个 fc 层之后,也会有有一个
relu 激活层,以及一个 dropout 层(减小参数量,防止过拟合,增加 i 网络结构变化)。最后
呢,通过一个 fc 层+softmax 层来将我们的数据映射到一个一千维的向量上去(因为实现的
是一千种物品的分类网络),这个向量就是我们输入的图像在这一千个类别上的概率分布。
其中概率值最高的那个类别就是网络判断出来图像所属的类别。相较与 LeNet 网络,它的网
络深度更深,并且成功运用了 gpu 进行运算,为后面的人们打开了新世界大门。整个网络的
参数量在 60 兆以上,最中训练出来的模型文件在 200 兆以上。它最大的意义在于,通过这
次实验,证明了更深层次的卷积神经网络,可以提取出更加鲁棒的特征信息,并且这些特征
信息能更好的区分物品类别。
在 AlexNet 网络中,有以下特点:
⚫ 增加了 relu 非线性激活函数,增强了模型的非线性表达能力。成为以后卷积层的标
配。
⚫ dropout 层防止过拟合。成为以后 fc 层的标配。
⚫ 通过数据增强,来减少过拟合。
⚫ 引入标准化层(Local Response Normalization):通过放大那些对分类贡献较大的神
经元,抑制那些对分类贡献较小的神经元,通过局部归一的手段,来达到作用。
(3)ZFNet
ZFNet 在 AlexNet 的基础上做了小小的改进:
⚫ 调整第一层卷积核大小为 77
⚫ 设置卷积参数 stride=2
通过更小的卷积核和更小的步长,来提取更多的信息,确保网络提取出来的信息更加有
效。其次,它增加了卷积核数量,导致网络更加庞大。最重要的是:它从可视化的角度出发,
解释了 CNN 有非常好的性能的原因
如图所示,右半边是一个正常的神经网络的数据流向:对于一副输入图像,通过 pooling
层来进行下采样,再通过卷积层进行特征提取,通过 relu 层来提升非线性表达能力。对于最
后的输出结果,怎么把它还原成原始的图片呢?实际上,如果想进行 100%的还原是不可能
的,因为每一次的 pooling 层都会丢失一些信息。因此我们在可视化的时候,更主要的是对
它的特征的语义进行更高层次的分析。通过对输出层进行上采样,可以得到与原始图像大小
一致的特征图。
(4) VGGNet
它由牛津大学计算机视觉组和 Google Deepmind 共同设计。主要是为了研究网络深度对
模型准确度的影响,并采用小卷积堆叠的方式,来搭建整个网络。它的参数量达到了 138M,
整个模型的大小>500M.网络结构如下:
从上面的结构中我们可以看到,VGGNet 的网络结构被分为 11,13,16,19 层。每层
都包含了不同数量的卷积层(需要注意的是,每层卷积层之后都有激活层和池化层,只是由
于长度限制没有在表中列出来),最后通过三个 fc 层来将我们的特征进行最后的向量化,最
终得到一个 1000 维的向量,这个向量经过 softmax 之后,就会得到最终我们类别上的概率
分布。而概率值最高的那个,就是我们所要分类的那个类别。
VGGNet 的特点:
⚫ 网络深,卷积层多。结构哦更加规整,简单。
⚫ 卷积核都是 3 3 的或者 1* 1 的,且同一层中 channel 的数量都是相同的。最大池
化层全是 22。
⚫ 每经过一个 pooling 层后,channel 的数量会乘上 2.也就是说,每次池化之后,Feature
Map 宽高降低一半,通道数量增加一倍。VGGNet 网络层数更多,结构更深,模型
参数量更大。
VGGNet 的意义:
⚫ 证明了更深的网络,能更好的提取特征。
⚫ 成为了后续很多网络的 backbone。
(5) GoogleNet/Inception v1
在设计网络结构时,不仅仅考虑网络的深度,也会考虑网络的宽度,并将这种结构定义
为 Inception 结构(一种网中网(Network in Network)的结构,即原来的节点也是一个网络)。值
得一提的是,GoogleNet 网络的参数量只有 6.9 兆,模型大小大约 50M。GoogleNet 网络的
基本单元的结构:
GoogleNet 有效的利用了 1 1 的卷积核。不同于 VGGNet 从上到下的类似于一个串的
结构,Inception 的结构表现为一个网中网的结构。也就是说,对于我们中间的一个隐藏层层,
它的每个节点也都是一个卷积网络。对于前一层传入进来的特征图,这层的每一个节点对它
进行了 1* 1 ,3* 3,5* 5 的卷积和 3* 3 的 pooling 操作。其中值得一提的是,在 3* 3 和 5*
5 的卷积操作之前,该网络用 1* 1 的卷积核降低了输入层的 channel 的数量。例如:我们的
输入是一个 56* 56 * 128 维的这么一个特征(这时候 128 就是我们 channel 的数量)。我们通
过一个 1* 1 的卷积核,可以将通道数降为 32,然后我们将它再输入到 3* 3 的卷积核中。大
大减少了计算量。最后,我们将所有的 Feature Map 进行连接,最后得到这个层的输出。
在 GoogleNet 中,为了保证网络更深之后,能够哦收敛的比较好,它采用了两个 loss 来
对网络参数进行调节,进而确保在网络变深之后,依然能够达到一个比较好的收敛效果。
(6)Inception v2/v3
在提出了 Inception v1 之后,google 又提出了 Inception v2/v3/v4.在前面介绍视觉感受野
的时候,我们曾经说过,一个大的卷积核可以由多个小的卷积核来替代。在 v2/v3 中,他们
有效的利用了这个知识。在 Inceptiion v2 中,伟大的作者们通过两层 3* 3 的卷积核代替掉
了 5* 5 的卷积核。而在 Inception v3 中,更是桑心病狂 别出心裁的用 n* 1 + 1* n 的卷积核
代替了 n* n 的卷积核。
通过这样的操作,能够
⚫ 参数量降低,计算量减少。
⚫ 网络变深,网络非线性表达能力更强(因为在每一个卷积层后面都可以增加一个激
活层)
(7) ResNet
ResNet 的网络结构如下所示:
跳连的结构如下所示:
可以发现,其他的网络中,都是从上到下的串联的结构 ,而 ResNet 网络则是跳连结构,
它的意思是将输入特征直接传输到输出层,和经过卷积之后的特征相加,共同组成输出层的
一部分。
各种卷积神经网络性能比较如下:
5.什么叫全连接神经网络(Fully Connected Neural Network)?
一个线性模型,输入神经元和每一个输出神经元都有连接计算。
标准答案
全连接神经网络解析:对 n-1 层和 n 层而言,n-1 层的任意一个节点,都和第 n 层所有
节点有连接。即第 n 层的每个节点在进行计算的时候,激活函数的输入是 n-1 层所有节点
的加权。全连接的神经网络示意图如图所示
6.什么叫递归神经网络?递归神经网络主要在哪些领域取得良好的表现?
也叫循环神经网络,前一个时刻的输出也可以作为下一个时刻的输入。 语音识别、机器翻译等与时序相关的任务。
标准答案
递归神经网络(recursive neural network)是具有树状阶层结构且网络节点按其连接
顺序对输入信息进行递归的人工神经网络(Artificial Neural Network, ANN),是深度学习
(deep learning)算法之一。
递归神经网络(recursive neural network)提出于 1990 年,被视为循环神经网络
(recurrent neural network)的推广。当递归神经网络的每个父节点都仅与一个子节点连接
时,其结构等价于全连接的循环神经网络。
递归神经网络是面向自然语言处理(Natural Language Processing, NLP)研究提出的
连接主义(connectionist)模型,在语法结构和情感分析领域,递归神经网络具有很好的表
现效果。
7.什么是长短时记忆网络 LSTM? 它有什么优点?
有三个门的RNN, 遗忘门,输入门, 输出门。能够记住较长时间间隔的信息。
标准答案
长短时神经网络 LSTM(Long Short-term Memory Networks)是一种特殊的类 RNN 型,
可以学习长期依赖信息。LSTM 通过刻意的设计来避免长期依赖问题。记住长期的信息在实
践中是 LSTM 的默认行为,而非需要付出很大代价才能获得的能力,其网络结构图如图所
示。
LSTM 网络结构,每一条黑线传输着一整个向量,从一个节点的输出到其他节点的输入。
粉色的圈代表按位 pointwise 的操作,诸如向量的和,而黄色的矩阵就是学习到的神经网络
层。合在一起的线表示向量的连接,分开的线表示内容被复制,然后分发到不同的位置。
长短时神经网络 LSTM 是一种改进之后的循环神经网络,不仅能够解决 RNN 无法处
理长距离的依赖的问题,还能够解决神经网络中常见的梯度爆炸或梯度消失等问题,在处理
序列数据方面非常有效。
长短时神经网络 LSTM 有效地解决了原始循环神经网络(RNN)的缺陷,在语音识别、图
片描述、自然语言处理等许多领域中成功应用。
第六章 TensorFlow深度学习
1. 请举例目前人工智能领域有哪些开源的深度学习开源框架?TensorFlow 与这些开源框架比较起来,有哪些优点?
caffe, torch,pytorch, mxnet, keras。 Tensorflow运行速度快,支持API多。
标准答案
在深度学习初始阶段,每个深度学习研究者都需要写大量的重复代码。为了提高工作
效率,这些研究者就将这些代码写成了一个框架放到网上让所有研究者一起使用。接着,网
上就出现了不同的框架。随着时间的推移,最为好用的几个框架被大量的人使用从而流行了
起来。研究者们也使用各种不同的框架来达到他们的研究目的,侧面印证出深度学习领域百
花齐放。全世界流行的深度学习框架有 PaddlePaddle、Tensorflow、PyTorch、Caffe、MindSpore
等。
**1.飞桨(PaddlePaddle)**以百度多年的深度学习技术研究和业务应用为基础,是中国首个
自主研发、功能完备、开源开放的产业级深度学习平台,集深度学习核心训练和推理框架、
基础模型库、端到端开发套件和丰富的工具组件于一体。目前,飞桨已凝聚超过 265 万开发
者,服务企业 10 万家,基于飞桨开源深度学习平台产生了 34 万个模型 。飞桨助力开发者
快速实现 AI 想法,快速上线 AI 业务。帮助越来越多的行业完成 AI 赋能,实现产业智能化
升级。
2. Tensorflow 是 Google 开源的一款使用 C++语言开发的开源数学计算软件,使用数
据流图(Data Flow Graph)的形式进行计算。图中的节点代表数学运算,而图中的线条表示多
维数据数组(tensor)之间的交互。Tensorflow 灵活的架构可以部署在一个或多个 CPU、GPU
的台式及服务器中,或者使用单一的 API 应用在移动设备中。Tensorflow 最初是由研究人员
和 Google Brain 团队针对机器学习和深度神经网络进行研究而开发,开源之后几乎可以在
各个领域适用。
3.Pytorch 是 Facebook 的 AI 研究团队发布了一个 Python 工具包,是 Python 优先的深
度学习框架,是 Python 优先的深度学习框架改进现有的神经网络。Pytorch 提供了更快速的方
法——不需要从头重新构建整个网络,这是由于 PyTorch 采用了动态计算图(dynamic
computational graph)结构,而不是大多数开源框架(TensorFlow 等)采用的静态计算图。
4. MindSpore 是由华为于 2019 年 8 月推出的新一代全场景 AI 计算框架,2020 年 3 月
28 日,华为宣布 MindSpore 正式开源。MindSpore 着重提升易用性并降低 AI 开发者的开发
门槛,MindSpore 原生适应每个场景包括端、边缘和云,并能够在按需协同的基础上,通过
实现 AI 算法即代码,使开发态变得更加友好,显著减少模型开发时间,降低模型开发门槛。
通过 MindSpore 自身的技术创新及 MindSpore 与华为昇腾 AI 处理器的协同优化,实现了运
行态的高效,大大提高了计算性能;MindSpore 也支持 GPU、CPU 等其它处理器。
TensorFlow 的主要优点有:
(1)运算性能强劲。在构建和部署机器学习系统时,性能是至关重要的。TensorFlow
1.0 加入的线性代数编译器 XLA 全方位地提升了计算性能。XLA 可以帮助 TensorFlow 在
CPU、GPU、TPU、嵌入式设备等平台上更快速地运行机器学习模型的训练与推理任务。同
时,TensorFlow 提供了大量针对不同软硬件环境的优化配置参数。用户可以根据自身的需求
和应用的特点,进一步提升计算性能。
(2)框架设计通用。TensorFlow并非只是纯粹的神经网络库。TensorFlow最初由Google
Brain 小组(隶属于 Google 机器智能研究机构)的研究员和工程师们开发出来,用于机器学
习和深度神经网络方面的研究,但其灵活的设计也可广泛用于其他计算领域。同时,
TensorFlow 既提供高层封装 API(如 Slim、Keras、TF Layers 等),能够帮助用户快速实现
算法原型,又提供底层原生 API,可以实现更灵活且高效的分布式并行模式。
(3)支持生产环境部署。TensorFlow 支持使用同一套 API 实现探索环境和生产环境
的部署。以前科研人员将算法原型推广到生产环境中使用的过程非常麻烦,因为这涉及大量
的模型重写和脚本适配工作。现在使用 TensorFlow 的算法研发人员既可以快速地将想法和
原型运用到生产环境的产品中,也可以在学术圈更方便地分享自己的研究成果。
(4)语言接口丰富。TensorFlow 核心层由 C++实现,应用层使用 SWIG 等技术封装,
提供了多语言 API 的支持。目前,官方支持的语言有 Python、C、C++、Java、Go 等。除此
之 外 , TensorFlow 的 社 区 贡 献 者 们 也 提 供 了 非 官 方 的 应 用 层 API , 如 Node.js
( https://github.com/node-tensorflow/node-tensorflow ) 、 Julia
(https://github.com/malmaud/TensorFlow.jl)、R(https://github.com/rstudio/tensorflow)。
(5)端云协同计算。TensorFlow 同时支持在云侧(服务器端)和端侧(移动设备等终
端)运行,有效结合了云侧和端侧的各自优势。在云侧方面,TensorFlow 提供多种并行模式
和编译优化等技术,尽可能提升算法模型的运算性能;在端侧方面,TensorFlow 提供轻量级
部署和 8 比特压缩等技术,尽可能提升计算和存储资源利用效率。
2.为什么说 Python 是一门适合开发人工智能应用的程序语言?与 C、Java 等程序开发语言相比,Python 的主要优点是什么?
python学习简单,代码逻辑符合正常的思维逻辑。Python也是集成了很多用于人工智能的第三方包,适用于模型训练。
Python和c、java相比,主要是面向对象的语音,调用简单,代码书写简单。
标准答案
之所以说 Python 是一门适合开发人工智能应用的程序语言,是因为其具有其他编程语言
如 C、JAVA 等所不具有的优点:
1、Python 遵循简单、优雅、明确的设计哲学
起初 Python 主要应用于编写自动化脚本,随着不断的更新,Python 功能更多,越来越
多的用于独立的、大型项目开发工作中,Python 在设计上一直坚持清晰的风格为主要,也让
Python 成为了一门简单易懂、容易维护,用途广泛的编程语言。
2、Python 是完全面向对象的编程语言
函数、模块、数字、字符串都是对象。并且完全支持继承、重载、派生、多继承,有益
于增强源代码的复用性。Python 支持重载运算符和动态类型。
3、Python 本身的设计可以进行扩充
Python 提供了丰富的 API 和工具,程序员能够轻松地使用 C 语言、C++、Cython 来编
写扩充模块。大家还将 Python 叫做胶水语言,它编译器本身可以被集成到其它需要脚本语
言的程序内。
总体来说,Python 这门语言具有很多的优势所在,简单、易学、速度快、可嵌入、可移
植等等,具有很多的作用,不仅可以从事人工智能,还可以从事 web 开发、爬虫、运维、游
戏开发等领域,发展前景是非常不错的,也适合零基础人员学习。
3.请问 TensorFlow 中的 session 是做什么用的?为什么需要 session?
session会话,首先要建立会话,算法模型才能在会话当中执行。
标准答案
TensorFlow 的内核使用更加高效的 C++作为后台,以支撑它的密集计算。TensorFlow 把
前台(即 python 程序)与后台程序之间的连接称为"会话(Session)"。TensorFlow 中只有让 Graph
(计算图)上的节点在 Session(会话)中执行,才会得到结果。Session 的开启涉及真实的
运算,因此比较消耗资源。在使用结束后,务必关闭 Session。
4.请用画图工具(工具不限)画出 TensorFlow 进行模型设计和训练的基本流程图。
标准答案
TensorFlow 对于深度学习模型的学习与训练提供了全套开发函数和支持库,极大降低
了开发者的难度。TensorFlow 的训练学习流程如图 1 所示。
TensorFlow 进行深度学习模型训练流程图
从图中可以看出,TensorFlow 进行深度学习模型训练流程图主要分为 5 个步骤:
1.对模型参数进行初始化,通常采用对参数随机赋值的方法。对于比较简单的模型可以
将各参数的初值均设为 0,然后读取已经分配好的训练数据 inputs(),包括每个数据样本及
其期望输出。
2.在训练数据上执行推断模型,在当前模型参数配置下,每个训练样本都会得到一个输
出值。然后是计算损失 loss(X,Y),依据训练数据 X 及期望输出 Y 计算损失。
3.不断调整模型参数 train(total_loss)。在给定损失函数的约束下,通过大量训练步骤改
善各参数的值,从而将损失最小化。本文选用 TensorFlow 提供的梯度下降算法 tf.gradients
进行学习。tf.gradients 通过符号计算推导出指定的流图步骤的梯度,并将其以张量形式输出,
由于 TensorFlow 已经实现了大量优化方法,因此不需要手工调用这个梯度计算函数,只需
要通过大量循环不断重复上述过程即可。
4.当训练结束后就便进入模型评估阶段 evaluate(sess, X, Y)。在这一阶段中,需要对一个
同样含有期望输出信息的不同测试集依据模型进行推断,并评估模型在该数据集上的损失。
由于测试集拥有训练集完全不同的样本,通过评估可以了解到所训练的模型在训练集之外识
别能力。
5.当对模型的准确率满意后,比如达到预设的 98%以上的准确率,就可以直接导出模型。
5.TensorFlow 是一种“符号式编程框架”,首先要构造一个图(graph),然后在会话(Session)上根据这个图做真实的运算(op),请思考一下,有这个图(graph)后给整个系统开发会带来哪些帮助?
拓展op的使用。
标准答案
在 TensorFlow 中每开发一个模型,都可以使用可视化调试工具 TensorBoard 得到这个
session 的 Graph。在 TensorFlow 开发中,TensorBoard 是一项很有用的可视化调试工具。在
TensorBoard 中,除了开发者自定义输出的数据结构之外,还包括表征神经网络模型的 Graph。
在 TensorFlow 中声明变量,定义关系后,在 TensorFlow 的内部形成了一张 Graph,以后
TensorFlow 所有的计算都是围绕这个 Graph 来展开的。在 TensorFlow 中会自动维护一个默
认的一个计算图,所以我们能够直接定义的 tensor 或者运算都会被转换为计算图上一个节
点。
v1 = tf.constant(value=1,name='v1',shape=(1,2),dtype=tf.float32)
v2 = tf.constant(value=2,name='v2',shape=(1,2),dtype=tf.float32)
add = v1 + v2
with tf.Session() as sess:
# 判断 v1 所在的 graph 是否是默认的 graph
print(v1.graph is tf.get_default_graph())
print(add)
# 输出 True
# 输出 [[3. 3.]]
TensorFlow 会自动维护一个默认的计算图,并将我们的节点添加到默认的计算图上。
TensorFlow 可以通过 tf.get_default_graph()来获取当前节点所在的计算图。
6. 深度学习是基于数据驱动的人工智能机器学习,可以学习样本数据的内在规律和表示层次,请问如何搜集、制作和划分自己模型所需要的训练集、验证集?
开源数据集、爬虫爬取数据、购买数据。
根据模型结构输入shape,处理自己的训练数据集。
训练集和验证集的划分,根据自己数据集数量的大小,数据量大可以多分一些做验证集。
标准答案
整个深度学习的过程大致分为 7 个阶段
⚫ 收集数据
⚫ 数据准备
⚫ 选择模型
⚫ 训练模型
⚫ 评估模型
⚫ 超参数调整
⚫ 模型测试
过去,人们运用机器学习传统方法的时候,一般将训练集和测试集划为 7:3.若有验证
集,则划为 6:2:2,如下图所示。这样划分确实很科学,当数据量不大的时候(万级别及以
下)。
但到了大数据时代,数据量陡增为百万级别,此时我们不需要那么多的验证集和训练集。
假设有 100W 条数据,只需要拿出 1W 条来当验证集,1W 条来当测试集,就能很好地 work
了。因此,在深度学习中若是数据很大,我们可以将训练集、验证集、测试集比例调整为 98:
1:1,如下图所示
第七章 数据采集与数据制作
1. 在需要使用数据集时,除了本章所介绍的比较有名的开放数据集平台,还有哪些途径寻找数据集?
爬虫爬取数据,供应商采买数据。
标准答案
答:除本章所介绍的数据集平台外,也可以使用 Python 的第三方库——scikit-learn 中自
带的数据集。scikit-learn 提供了的数据主要有两类:(1)现在网上一些常用的数据集,可以
通过方法加载;(2)使用 sklearn 可以生成所设定的数据,如设定数据规模、噪声等。
或者使用本章所介绍的爬虫技术,爬取数据并进行数据处理,得到适合研究和使用的数
据集。
机器学习高质量数据集大集合:https://zhuanlan.zhihu.com/p/48935320
2. 在采集数据时应注意哪些问题?
web爬虫需要注意网站的robot.txt协议,不要违背。不要违法获得。
标准答案
答:**第一,确定采集途径。**选择网页采集还是 API(网页,APP,小程序)采集,网页
采集需要使用工具(正则,HTMLAgility,Xpath 等),将需要的数据提取出来;API 采集的
话,一般直接就可以得到 json 数据了。
第二,数据采集前,了解网站爬虫限制策略, 或者使用 demo 测试网站的相关限制,如:
访问限制(口令、访问频率)、超时处理、错误处理等。
第三,分析数据采集层次。通常是通过网页层次,一层一层地去采集数据:先获取分类,
再找出分页参数规律,获取分类里面的所有列表及详情超链接,最后再下载图片视频等静态
资源。每一步只做简单重复的步骤,保证每个采集单元都是简单的操作。
第四,异常中断处理。采集过程中可能会遇到一些中断的问题,如原始数据错误导致了
程序错误、网络超时或访问限制,那么,可以采用小步数据持续化,如每采集 200 条记录存
一次,清空一下内存里面的数据,记录采集进度位置,继续采集,发生异常时可以做异常二
次采集操作。
第五,采集模式优化。 如果单线程执行任务耗时过长,则在采集目标站点访问频率允许
的条件下,我们可以通过多线程或者多进程来加快采集速度。
3. 如何打造高质量的机器学习数据集?
数据清洗。清理异常数据。
标准答案
答:打造高质量的机器学习数据集需要做很多工作,这里分享一个有用且高效的技巧。
清洗最原始数据之前可以在 GitHub 找文本清洗正则表达式,可以解决特殊字符清洗,连续
空白字符清洗,HTML 标签,标点格式化,文本切分,单词拼写判定,日期格式化,邮箱、
电话、网址识别,数字、货币、各种度量衡单位识别问题。
4. 数据挖掘中常用的数据清洗方法有哪些?
缺失值处理,字符串替换或者均值替换;去掉异常值;删除重复数据。
标准答案
答:(1)解决不完整数据(即值缺失)
大多数情况下,缺失的值必须手工填入(即手工清理)。当然,某些缺失值可以从本数
据源或其它数据源推导出来,这就可以用平均值、最大值、最小值或更为复杂的概率估计代
替缺失的值,从而达到清理的目的。
(2)错误值的检测
用统计分析的方法识别可能的错误值或异常值,如偏差分析、识别不遵守分布或回归方
程的值,也可以用简单规则库(常识性规则、业务特定规则等)检查数据值,或使用不同属
性间的约束、外部的数据来检测和清理数据。
(3)重复记录的检测及消除
数据库中属性值相同的记录被认为是重复记录,通过判断记录间的属性值是否相等来检
测记录是否相等,相等的记录合并为一条记录(即合并/清除)。合并/清除是消重的基本方法。
(4)不一致性(数据源内部及数据源之间)检测
从多数据源集成的数据可能有语义冲突,可定义完整性约束用于检测不一致性,也可通
过分析数据发现联系,从而使得数据保持一致
第八章 GPU并行计算与CUDA编程
1.简述 GPU 的工作原理?与常规的 CPU 计算相比,GPU 计算的优势在哪里?
GPU 并行计算,ALU大量计算图形化数据。优势计算速度快。
标准答案
图形处理器(英语:graphics processing unit,缩写:GPU),又称显示核心、视觉处理
器、显示芯片。GPU 以图形类数值计算为核心。用于处理类型高度统一、相互无依赖的大规
模数据和不需要被打断的纯净的计算环境。GPU 擅长的是图形类的或者是非图形类的高度
并行数值计算,GPU 可以容纳上千个没有逻辑关系的数值计算线程,它的优势是无逻辑关
系数据的并行计算。GPU 使显卡减少了对 CPU 的依赖,并进行部分原本 CPU 的工作,尤
其是在 3D 图形处理时 GPU 所采用的核心技术有硬件 T&L(几何转换和光照处理)、立方
环境材质贴图和顶点混合、纹理压缩和凹凸映射贴图、双重纹理四像素 256 位渲染引擎等。
CPU 和 GPU 都是具有运算能力的芯片,CPU 更像“通才”——指令运算(执行)为重+数
值运算,需要具备处理不同数据类型的能力,具有很强的通用性,CPU 内部结构非常复杂。
CPU 擅长像操作系统、系统软件和通用应用程序这类拥有复杂指令调度、循环、分支、逻辑
判断以及执行等的程序任务。GPU 更像“专才”——图形类数值计算为核心。如图所示:
由于 GPU 具有高并行结构(highly parallel structure),所以 GPU 在处理图形数据和复
杂算法方面拥有比 CPU 更高的效率。。
2.什么是 CUDA?简述 CUDA 编程模型。
能使程序运行在GPU的语言。
标准答案
CUDA(Compute Unified Device Architecture)是显卡厂商 NVIDIA 推出的运算平台。
CUDA™是一种由 NVIDIA 推出的通用并行计算架构,该架构使 GPU 能够解决复杂的计算
问题。 它包含了 CUDA 指令集架构(ISA)以及 GPU 内部的并行计算引擎。
CUDA 是一种新的操作 GPU 计算的硬件和软件架构,它将 GPU 视作一个数据并行计
算设备,而且无需把这些计算映射到图形 API。操作系统的多任务机制可以同时管理 CUDA
访问 GPU 和图形程序的运行库,其计算特性支持利用 CUDA 直观地编写 GPU 核心程序。
CUDA 程序构架分为两部分:Host 和 Device。Host 指的是 CPU,Device 指的是 GPU。
在 CUDA 程序构架中,主程序还是由 CPU 来执行,而当遇到数据并行处理的部分,CUDA
就会将程序编译成 GPU 能执行的程序,并传送到 GPU。而这个程序在 CUDA 里称做核
(kernel)。CUDA 允许程序员定义称为核的 C 语言函数,从而扩展了 C 语言,在调用此类函
数时,它将由 N 个不同的 CUDA 线程并行执行 N 次,这与普通的 C 语言函数只执行一次的
方式不同。执行核的每个线程都会被分配一个独特的线程 ID,可通过内置的 threadIdx 变量
在内核中访问此 ID。在 CUDA 程序中,主程序在调用任何 GPU 内核之前,必须对核进行
执行配置,即确定线程块数和每个线程块中的线程数以及共享内存大小。
3.在 TensorFlow 和 PyTorch 深度学习框架下如何调用 CUDA 进行加速?
pytorch:第一判断是否能用GPU 第二把模型放到cuda上 第三把数据放到cuda上。
标准答案
TensorFlow:
python 代码中设置使用的 GPU:
import os
import tensorflow as tf
os.environ["CUDA_VISIBLE_DEVICES"] = "2"
# 设置显存
gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.7)
sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options))
# 上面分配给 tensorflow 的 GPU 显存大小为:GPU 实际显存*0.7。
pytorch
把数据从内存转移到 GPU,一般针对张量和模型。对张量(类型为 FloatTensor 或者是
LongTensor 等),一律直接使用方法.to(device)或.cuda()即可。
import torch
print(torch.cuda.is_available()) # true or false 判断是否可以用GPU
Class Model(torch.nn.Module):
pass
model = Model()
if torch.cuda.is_available():
model.cuda()
x_train, y_train = x_train.cuda(), y_train.cuda()
device = "cuda" if torch.cuda.is_available() else "cpu"
# 创建一个张量
tensor = torch.randn(3, 3)
# 将张量传输到设备
tensor_cuda = tensor.to(device)
未完待续