深度学习(机器学习)知识总结
目录
1. Python概述
发展历程
Python is a programming language that lets you work quickly and integrate systems more effectively.
- Python是一门解释型、面向对象的高级编程语言
- Python是开源免费的、支持交互式、可跨平台移植的脚本语言
诞生和发展
- 1991年,第一个Python编译器(同时也是解释器)诞生。它是用C语言实现的,并能够调用C库(.so文件)。从一开始,Python已经具有了 类、函数、异常处理、包含表和词典在内的核心数据类型以及模块为基础的拓展系统。
- 2000年,Python 2.0 由BeOpenPythonLabs团队发布,加入内存回收机制,奠定了Python语言框架的基础
- 2008年,Python 3 在一个意想不到的情况下发布了,对语言进行了彻底的修改,没有向后兼容
2020年8月份编程语言排行榜
Python典型应用方向
- 数据分析:对数据进行清洗、去重、规格化和针对性的分析是大数据行业的基石。Python是数据分析的主流语言之一,其它如R、SAS、Perl等
- 科学计算:随着NumPy、SciPy、Matplotlib、Pandas等众多程序库的开发,Python越来越适合于做科学计算、绘制高质量的2D和3D图像
- 人工智能:Python在人工智能大范畴领域内的机器学习、神经网络、深度学习等方面都是主流的编程语言,得到广泛的支持和应用。主流的深度学习框架如TensorFlow、Torch、Caffe等都支持Python,甚至大部分官方推荐使用Python
- 常规软件开发:支持函数式编程和OOP面向对象编程,适用于常规的软件开发、脚本编写、网络编程
- 云计算:开源云计算解决方案OpenStack就是基于Python开发的
- 网络爬虫:大数据行业获取数据的核心工具。Python是编写网络爬虫的主流编程语言,Scrapy爬虫框架应用非常广泛
- WEB开发:基于Python的Web开发框架很多,如Django,Tornado,Flask
- 自动化运维:运维工程师首选的编程语言
2. 基本语法
2.1 安装
Python是跨平台的,可以运行在Windows、Mac和各种Unix/Linux系统上,安装方法请自行查找。
目前,Python有两个版本,一个是2.x版,一个是3.x版,这两个版本是不兼容的,本教程以Python3.5版本为基础(Windows上安装时注意添加环境变量)。
Python代码是以.py为扩展名的文本文件,要运行代码,需要安装Python解释器:
- CPython:官方默认编译器,安装Python后直接获得该解释器,以>>>作为提示符
- Ipython:基于Cpython的一个交互式解释器,用In [序号]: 作为提示符
- 其他:如PyPy(采用JIT技术,执行速度快)、Jython(运行在Java平台)、IronPython
2.2 Python数据结构
2.2.1 数字(Number)
Python Number 数据类型用于存储数值,包括整型、长整型、浮点型、复数。
Python原生支持常用数字运算,例如加、减、乘、除、幂等
Python中其它数学运算常用的函数基本都在math 模块:
Python 随机数
- 随机生成一个[0,1)范围内的实数
- 随机生成一个[1,20)范围内的整数
- 当使用random.seed(x) 设定好种子之后,random() 生成的随机数将会是同一个
2.2.2 字符串(String)
- 单引号、双引号、三引号:Python中的字符串可以使用单引号、双引号和三引号(三个单引号或三个双引号)括起来,使用反斜杠\转义特殊字符
- 字符串连接
使用+运算符:
使用join运算符:
2.2.3 列表(List)
声明一个列表,并使用下标访问元素:
访问最后一个元素:
访问第一个元素:
列表查询:查询names列表中有没有值为’superman’的元素
列表添加:
- append():在列表末尾追加元素
- extend():合并列表
- insert():在指定位置添加
列表修改:
- 修改指定元素
- 将fruits列表中的‘香蕉’替换为‘banana’
列表删除:
- del()函数:删除列表指定元素
- remove():
- pop():
列表切片:[]中设置要使用的第一个元素和最后一个元素的索引。牢记:左闭右开。
假设列表元素为:
列表排序:
生成10个不同的随机数,存至列表中,并进行排序
2.2.4 元组(Tuple)
与列表类似,区别是元组中的内容不可修改。
定义无组:定义一个元组,注意元组中只有一个元素时,需要在后面加逗号。
列表转元组:
元组不能修改,所以不存在往元组里加入元素。那作为容器的元组,如何存放元素?
元组截取:
元组的一些函数:max()、min()、sum()、len()这些函数针对序列都是通用的,例如列表、元组、集合等。
元组的拆包与装包
-
元组元素个数与变量个数相等:
- 元组元素个数与变量个数不相等:
2.2.5 字典(Dict)
-
定义一个空字典:注意与定义空集合的区别
-
定义一个字典的同时,进行初始化
- 定义一个字典,之后添加元素
-
修改字典元素
- 字典相关函数
items():
keys():
values():
字典删除:
- del()
- pop()
2.3 类
定义一个类Animals:
- init()定义构造函数,与其他面向对象语言不同的是,Python语言中,会明确地把代表自身实例的self作为第一个参数传入
- 创建一个实例化对象cat,init()方法接收参数
- 使用点号.来访问对象的属性。
通过继承创建的新类称为子类或派生类,被继承的类称为基类、父类或超类。
2.4 Python JSON
JSON序列化与反序列化
- JSON序列化:json.dumps用于将Python 对象编码成JSON 字符串。
- JSON反序列化:json.loads用于解码JSON 数据。该函数返回Python 字段的数据类型。
2.5 Python异常处理
- try/except语句用来检测try语句块中的错误,从而让except语句捕获异常信息并处理。
- finally中的内容,退出try时总会执行。常常用来关闭文件、释放资源等操作。
3. 机器学习常用库
3.1 Numpy库
Numpy(Numerical Python的简称)是高性能科学计算和数据分析的基础包。其部分功能如下:
- ndarray,一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组。
- 用于对整组数据进行快速运算的标准数学函数(无需编写循环)。
- 用于读写磁盘数据的工具以及用于操作内存映射文件的工具。
- 线性代数、随机数生成以及傅里叶变换功能。
- 用于集成由C、C++、Fortran等语言编写的代码的工具。
3.2 Pandas库
Pandas库介绍:
- Pandas是python第三方库,提供高性能易用数据类型和分析工具
- Pandas基于Numpy实现,常与Numpy和Matplotlib并称为机器学习三驾马车。也有四驾马车的叫法:NumPy、Pandas、Matplotlib、Seaborn,其中Seaborn是基于Matplotlib的高级封装,提供了许多绘图模板。
- Pandas中有两大核心数据结构:Series(一维数据)和DataFrame(多特征数据,既有行索引,又有列索引)
3.3 PIL库
PIL库介绍:
- PIL库是一个具有强大图像处理能力的第三方库
- 在命令行下的安装方法:pip install pillow
- 在使用过程中的引入方法:from PIL import Image
- Image 是PIL 库中代表一个图像的类(对象)
3.4 Matplotlib库
Matplotlib库介绍:
- Matplotlib库由各种可视化类构成,内部结构复杂
- 受Matlab启发,matplotlib.pylot是绘制各类可视化图形的命令字库,相当于快捷方式
4. 深度学习平台
4.1 主流的深度学习平台
目前市面上存在很多深度学习框架,那么如何选择一款合适的框架进行学习、研究或落地呢?
总体的一个建议是:
- 如果是深度学习新手,建议选择Keras进行学习,因为其简单、容易上手。
- 如果是出于研究目的,建议选择PyTorch,好多顶会论文、优秀项目都是基于PyTorch的。
- 如果是基于落地生产、平台部署等目的,建议选择TensorFlow,谷歌出品,必属精品,在工业支持方面做的非常优秀。
- 其它目的或领域,相信您有能力找到一个合适的框架。
4.1.1 TensorFlow
TensorFlow是歌基于C++开发、发布的第二代机器学习系统。开发目的是用于进行机器学习和深度神经网络的研究。但内部概念众多,结构复杂,API繁重上手困难,版本迭代快而API兼容性存在问题。
TensorFlow官网:https://www.tensorflow.org/ (国内可能打不开)
TensorFlow中文官网:https://tensorflow.google.cn/
github项目地址:https://github.com/tensorflow/tensorflow
4.1.2 PyTorch
PyTorch是Facebook在深度学习框架Torch的基础上使用Python重写的一个全新的深度学习框架,它更像NumPy的替代产物,但其模型部署难度较高,对于工业界应用支持存在比较明显的缺陷。
PyTorch官网:https://pytorch.org/
github项目地址:https://github.com/pytorch/pytorch
4.1.3 Keras
4.1.4 MXNet
4.1.5 PaddlePaddle
飞桨是以百度多年的深度学习技术研究和业务应用为基础,集深度学习核心框架、基础模型库、端到端开发套件、工具组件和服务平台于一体,2016 年正式开源,是全面开源开放、技术领先、功能完备的产业级深度学习平台。飞桨源于产业实践,始终致力于与产业深入融合。目前飞桨已广泛应用于工业、农业、服务业等,服务190 多万开发者,与合作伙伴一起帮助越来越多的行业完成AI 赋能。
官网:https://www.paddlepaddle.org.cn/
github项目地址:https://github.com/paddlepaddle/paddle
4.2 PaddlePaddle
4.2.1 飞桨的全景
飞桨(PaddlePaddle)以百度多年的深度学习技术研究和业务应用为基础,是中国首个开源开放、技术领先、功能完备的产业级深度学习平台,集深度学习核心训练和推理框架、基础模型库、端到端开发套件和丰富的工具组件于一体。
飞桨四大领先技术:
4.2.2 本地环境搭建
目前飞桨支持以下环境:
- Ubuntu 14.04 /16.04 /18.04
- CentOS 7 / 6
- MacOS 10.11 / 10.12 / 10.13 / 10.14
- Windows7 / 8/ 10 (专业版/企业版)
飞桨支持使用pip快速安装,执行下面命令完成CPU版本的快速安装:
pip install paddlepaddle-i https://pypi.tuna.tsinghua.edu.cn/simple
如需安装GPU版本的飞桨PaddlePaddle,或查询更详细的安装方法,请参考安装说明:
https://www.paddlepaddle.org.cn/documentation/docs/zh/install/index_cn.html
4.3 AI Studio平台
AI Studio是一站式深度学习开发平台,集开放数据、开源算法、免费算力三位一体,为开发者提供高效学习和开发环境、高价值高奖金竞赛项目,支撑高校老师轻松实现AI教学,并助力开发者加速落地AI业务场景。
官网地址:http://aistudio.baidu.com/
帮助文档:https://ai.baidu.com/docs#/AIStudio_Tutorial/top
5. 深度学习基础
5.1 深度学习概述
5.1.1 什么是人工智能
人工智能(Artificial Intelligence),英文缩写为AI。它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新技术科学。
- 结构模拟:机器人学
- 功能模拟:以任务为核心,例如模式识别、机器学习、深度学习自然语言处理、音频识别、定位跟踪、图像理解、知识推理、数据预测等等
总结来说:人工智能就是使一部机器的反应方式像人一样进行感知、认知、决策、执行的人工程序或系统。
5.1.2 什么是机器学习
5.1.3 什么是深度学习
5.1.4 深度学习发展历程
- 第一次高潮:
1962年,Frank Rosenblatt 提出感知器模型
1969年,M.Minsky 等人指出感知器不能解决高阶谓词问题和异或问题,将感知器拉下神坛
-
第二次高潮:
人工智能对自动制导车的失败,而利用神经网络有可能解决这个问题,导致了人工神经网络的第二次高潮。
1986年,Rumelhart等提出多层网络的学习算法—反向传播算法
-
第三次高潮:
2006年,深度学习被提出,开始使用更深的网络模型。
2012年,深度学习算法在语言和视觉识别上实现突破。
5.2 深度学习入门知识
5.2.1 生物神经元
生物神经元:
- 神经元间通过突触两两相连
- 树突接收来自多个神经元的信号
- 轴突根据树突传递过来的综合信号的强弱是否超过某一阈值来决定是否将该信号传递给下一个神经元
生物神经元的启示:
- 每个神经元都是一个多输入单输出的信号处理单元
- 神经元具有阈值特性
5.2.2 人工神经元
5.2.3 **函数
-
Sigmoid函数:
,导数表达式为:
-
tanh(双曲正切)函数:
,导数表达式为:
- ReLU函数:
,导数表达式为:
5.2.4 多层神经网络
- 输入层:接收输入信号的层
- 隐含层:不直接与外部环境打交道,隐含层的层数可从零到若干层
- 输出层:产生输出信号的层
5.2.5 全连接神经网络
前馈/全连接神经网络:每层每个节点均和上一层的所有节点相连
全连接/前馈神经网络是能解决很多问题,但是本身存在一个问题,对于某些数据而言,一是参数量巨大,二是不能充分应用数据的某些特性。
5.2.6 卷积神经网络(CNN)
- 引入特性:局部连接(图像局部上下文)
- 输入层:不是向量,而是一个三维数组(图像)
- 卷积层:对三维数组及其权重的计算方式。卷积核(参数)在通过逐一滑动窗口计算而得
- 池化/采样层:直接抽样选取极小局部的某一元素作为下一层的元素。有最大池化和平均池化。
卷积神经网络就相当于一个黑盒,输入图像经过黑盒(卷积神经网络)输出一些提取的特征。
经典卷积神经网络有:LeNet、AlexNet、VGGNet、GoogLeNet、ResNet等。
5.2.7 循环神经网络(RNN)
- 引入特性:时序,处理序列数据(文本上下文)
- 对序列数据的处理:每次输入序列中的一个单元,然后保存每一个隐层神经元的计算结果,留给下一个输入时该神经元进行使用
- 历史信息:保存的隐层单元计算结果,含有上一次输入的信息
经典RNN网络有:LSTM、GRU、Bi-RNN、Seq2Seq