为深度学习人员准备的Python快速入门教程
更新日志
2017.11.13 创建
2017.11.18 增加numpy入门教程
2017.12.06 增加opencv相关内容
人生苦短,你需要Python
Life is short, Have an Affair you need Python
— Bruce Eckel
Python简介
Python是一门解释型的高级编程语言,特点是简单明确。Python作者是荷兰人Guido van Rossum,1982年他获得数学和计算机硕士学位后,在荷兰数学与计算科学研究所(Centrum Wiskunde & Informatica, CWI)谋了份差事。在CWI期间,Guido参与到了一门叫做ABC的语言开发工作中。
1989年的圣诞假期,闲得蛋疼的Guido决定设计一门简单易用的新语言,要介于C和Shell之间,同时吸取ABC语法中的优点。Guido用自己喜欢的一部喜剧电视剧来命名这门语言:《Monty Python’s Flying Circus》。
Python简史
- 1989年的圣诞节,Guido开始编写Python语言的编译器。
- 1991年,第一个Python编译器(同时也是解释器)诞生。它是用C语言实现的,并能够调用C库(.so文件)。
- Python 2.0 - 2000/10/16,加入了内存回收机制,构成了现在Python语言框架的基础
- Python 3.0 - 2008/12/03
- Python 2.7 - 2010/07/03
2014年11月,Python2.7将在2020年停止支持的消息被发布,所有的最新的标准库的更新改进,只会在3.x的版本里出现。并且不会在发布2.8版本,建议用户尽可能的迁移到3.4+
为什么要python
入门比较简单:搞机器学习的,大部分都不会写代码,人家是学数学的,你要人家用c++写cuda,写出来的代码效率高不高是次要,学习成本有多高
开发生态成熟:说的直接点就是库多,NumPy,还有SciPy,NLTK,OpenCV,MatplotLib,更不用说linux自带python
效率高:这个效率是开发效率,python因为是高级解释型语言,所以在性能方面当然是无法满足大规模数据训练的,但是因为技术进步,计算的的成本大大降低,反而开发的时间成为瓶颈。
学术界所探讨的是可能性问题,而工业界是实现性问题。所以,学术界的代码灵活性很高!经常提出新的想法和实现再加上python的主流框架caffe,tensorflow,pytorch和更上次层的封装keras,
你可以毫不费力的通过这条路复现学术论文的结果
jupyter notebook:这个绝对可以算作一个重要原因,做个笔记什么就不是事,开会的时候做展示,也是萌萌哒
python 入门
python安装
刚才已经说了Python有两个大版本,但是建议安装python3,这里推荐安装anaconda,专门为机器学习制作的整合包,里面基本上包都全了,再装个tensorflow和keras就可以开工了
Python基本语法
基本数据类型
Python中最基本的数据类型包括整型,浮点数,布尔值和字符串。类型是不需要声明的,其中#是行内注释的意思。最后一个None是NoneType
|
|
变量和引用
Python中基本变量的赋值一般建立的是个引用
|
|
a赋值为1后,b=a执行时并不会将a的值复制一遍,然后赋给b,而是简单地为a所指的值,也就是1建立了一个引用,相当于a和b都是指向包含1这个值的这块内存的指针。所以c=1执行的也是个引用建立,这三个变量其实是三个引用,指向同一个值。.Python内置了id函数,可以返回一个对象的地址,用id函数可以让我们知道每个变量指向的是不是同一个值
运算符
|
|
相等或不等
==和!=比较引用指向的内存中的内容,而is判断两个变量是否指向一个地址
|
|
模块导入
|
|
容器
主要包括列表(list),元组(tuple),字典(dict)和集合(set)
列表(list)
列表对类型没什么限制
|
|
元组(tuple)
元组和列表有很多相似的地方,最大的区别在于不可变
|
|
集合(set)
|
|
字典(dict)
键-值”(key-value)映射结构,键无重复,一个键不能对应多个值,不过多个键可以指向一个值。
初始化字典和集合很像,的确如此,集合就像是没有值只有键的字典
|
|
分支和循环
for循环
|
|
每个for循环中,print都有缩进,这是Python中一个让人非常 讨厌 喜爱的特点:强行缩进来表明成块的代码。
if和分支结构
|
|
隐式表达式为False的是如下状况:
- None
- False
- 数值0
- 空的容器或序列(字符串也是一种序列)
- 用户自定义类中,如果定义了__len__()或者__nonzero__(),并且被调用后返回0或者False
while循环
|
|
函数
|
|
生成器(Generator)
生成器是迭代器的一种,形式上看和函数很像,只是把return换成了yield,在每次调用的时候,都会执行到yield并返回值,同时将当前状态保存,等待下次执行到yield再继续
|
|
类(Class)
|
|
异常
|
|
pip
pip 是一个安装和管理 Python 包的工具,提供了对 Python 包的查找、下载、安装、卸载的功能。
|
|
科学计算包 – Numpy
numpy(Numerical Python extensions)是一个第三方的Python包,用于科学计算。这个库的前身是1995年就开始开发的一个用于数组运算的库。经过了长时间的发展,基本上成了绝大部分Python科学计算的基础包,当然也包括所有提供Python接口的深度学习框架。
最新的消息是Numpy将于2020年结束python2.7的支持,所以还是尽快迁移到3.x吧
Numpy 基本类型(array)
array,也就是数组,是numpy中最基础的数据结构,最关键的属性是维度和元素类型,在numpy中,可以非常方便地创建各种不同类型的多维数组,并且执行一些基本基本操作,来看例子:
|
|
array的数组相关操作也非常的丰富,包括:
|
|
numpy的基础数学运算
|
|
numpy中的广播(broadcasting)
多个array的对位运算需要array的维度一致,如果一个array的维度和另一个array的子维度一致,则在没有对齐的维度上分别执行对位运算,这种机制叫做广播(broadcasting),吴恩达老师在他的deeplearning教程中想系介绍过这种机制,这里就不细说了,只看例子
|
|
线性代数模块(linalg)
线性代数模块(linalg)是深度学习中最常用的模块之一,
numpy提供的基本函数,可以对向量,矩阵,或是说多维张量进行一些基本的运算
|
|
随机模块(random)
随机模块包含了随机数产生和统计分布相关的基本函数,Python本身也有随机模块random,不过功能更丰富,一般情况下都是用来对神经网络参数进行初始化
|
|
可视化包 – Matplotlib
Matplotlib是Python中最常用的可视化工具之一,可以非常方便地创建海量类型地2D图表和一些基本的3D图表。Matplotlib最早是为了可视化癫痫病人的脑皮层电图相关的信号而研发,因为在函数的设计上参考了MATLAB,所以叫做Matplotlib。Matplotlib首次发表于2007年,在开源和社区的推动下,现在在基于Python的各个科学计算领域都得到了广泛应用。
2D图表
2D图表是最简单的图表,也是在机器学习和深度学习中用到最多的,
Matplotlib中最基础的模块是pyplot。先从最简单的点图和线图开始,比如我们有一组数据,还有一个拟合模型,通过下面的代码图来可视化:
|
|
点和线图表只是最基本的用法,其实这对于机器学习领域已经差不多够了,但是有的时候我们在分析时可能会需要对数据进行对比,这就需要用到柱状或饼状类型的图:
|
|
3D图表
Matplotlib中也能支持一些基础的3D图表,比如曲面图,散点图和柱状图。这些3D图表需要使用mpl_toolkits模块
生成一个所有值均为0的复数array作为初始频谱,然后把频谱中央部分用随机生成,但同时共轭关于中心对称的子矩阵进行填充。这相当于只有低频成分的一个随机频谱。最后进行反傅里叶变换就得到一个随机波动的曲面
|
|
散点图也是常常用来查看空间样本分布的一种手段,并且画起来比表面图和网线图更加简单,先采样了一堆3维的正态分布样本,保证方向上的均匀性。然后归一化,让每个样本到原点的距离为1,相当于得到了一个均匀分布在球面上的样本。再接着把每个样本都乘上一个均匀分布随机数的开3次方,这样就得到了在球体内均匀分布的样本,最后根据判别平面3x+2y-z-1=0对平面两侧样本用不同的形状和颜色画出
|
|
图像显示
Matplotlib也支持图像的存取和显示,读取一个本地图片并显示,还可以对图片进行简单的处理:
|
|
OpenCV
OpenCV是计算机视觉领域应用最广泛的开源工具包,OpenCV最早源于Intel公司1998年的一个研究项目,当时在Intel从事计算机视觉的工程师盖瑞·布拉德斯基(Gary Bradski)访问一些大学和研究组时发现学生之间实现计算机视觉算法用的都是各自实验室里的内部代码或者库,这样新来实验室的学生就能基于前人写的基本函数快速上手进行研究。于是OpenCV旨在提供一个用于计算机视觉的科研和商业应用的高性能通用库。
windows环境下安装
|
|
验证:如果没报错,说明安装问没问题
|
|
模块介绍
calib3d : Calibration(校准)加3D这两个词的组合缩写。这个模块主要是相机校准和三维重建相关的内容。基本的多视角几何算法,单个立体摄像头标定,物体姿态估计,立体相似性算法,3D信息的重建等等。
contrib : Contributed/Experimental Stuf的缩写, 该模块包含了一些最近添加的不太稳定的可选功能,不用去多管。2.4.8以后新增了新型人脸识别,立体匹配,人工视网膜模型等技术。
core——核心功能模块,包含如下内容:
- OpenCV基本数据结构
- 动态数据结构
- 绘图函数
- 数组操作相关函数
- 辅助功能与系统函数和宏
- 与OpenGL的互操作
imgproc: Image和Processing这两个单词的缩写组合。图像处理模块,这个模块包含了如下内容:
- 线性和非线性的图像滤波
- 图像的几何变换
- 其它(Miscellaneous)图像转换
- 直方图相关
- 结构分析和形状描述
- 运动分析和对象跟踪
- 特征检测
- 目标检测等内容
features2d:Features2D, 2D功能框架 ,包含如下内容:
- 特征检测和描述
- 特征检测器(Feature Detectors)通用接口
- 描述符提取器(Descriptor Extractors)通用接口
- 描述符匹配器(Descriptor Matchers)通用接口
- 通用描述符(Generic Descriptor)匹配器通用接口
- 关键点绘制函数和匹配功能绘制函数
flann:Fast Library for Approximate Nearest Neighbors,高维的近似近邻快速搜索算法库,包含两个部分:
- 快速近似最近邻搜索
- 聚类
gpu:运用GPU加速的计算机视觉模块
highgui:high gui,高层GUI图形用户界面,包含媒体的I / O输入输出,视频捕捉、图像和视频的编码解码、图形交互界面的接口等内容
legacy:一些已经废弃的代码库,保留下来作为向下兼容,包含如下相关的内容:
- 运动分析
- 期望最大化
- 直方图
- 平面细分(C API)
- 特征检测和描述(Feature Detection and Description)
- 描述符提取器(Descriptor Extractors)的通用接口
- 通用描述符(Generic Descriptor Matchers)的常用接口
- 匹配器
ml : Machine Learning,机器学习模块, 基本上是统计模型和分类算法,包含如下内容:
- 统计模型 (Statistical Models)
- 一般贝叶斯分类器 (Normal Bayes Classifier)
- K-近邻 (K-NearestNeighbors)
- 支持向量机 (Support Vector Machines)
- 决策树 (Decision Trees)
- 提升(Boosting)
- 梯度提高树(Gradient Boosted Trees)
- 随机树 (Random Trees)
- 超随机树 (Extremely randomized trees)
- 期望最大化 (Expectation Maximization)
- 神经网络 (Neural Networks)
- MLData
nonfree:一些具有专利的算法模块 ,包含特征检测和GPU相关的内容。最好不要商用,可能会被告哦。
objdetect:目标检测模块,包含Cascade Classification(级联分类)和Latent SVM这两个部分。
ocl:OpenCL-accelerated Computer Vision,运用OpenCL加速的计算机视觉组件模块
photo:Computational Photography,包含图像修复和图像去噪两部分
stitching:images stitching,图像拼接模块,包含如下部分:
- 拼接流水线
- 特点寻找和匹配图像
- 估计旋转
- 自动校准
- 图片歪斜
- 接缝估测
- 曝光补偿
- 图片混合
superres:SuperResolution,超分辨率技术的相关功能模块
ts:opencv测试相关代码
vide:视频分析组件,该模块包括运动估计,背景分离,对象跟踪等视频处理相关内容。
Videostab:Video stabilization,视频稳定相关的组件
与tf整合
1.TensorFlow与OpenCV,读取图片,进行简单操作并显示
1 OpenCV读入图片,使用tf.Variable初始化为tensor,加载到tensorflow对图片进行转置操作,然后opencv显示转置后的结果
|
|
2.OpenCV读入图片,使用tf.placeholder符号变量加载到tensorflow里,然后tensorflow对图片进行剪切操作,最后opencv显示转置后的结果:
|
|