深度学习入门基于Python的理论与实现_第一章_Python入门
前言
- 此书使用Python作为编程语言,尽可能地少使用外部库,从零开始实现深度学习的程序。
- 此书从简单的机器学习问题开始,最终实现一个能高精度地识别图像的系统。
- 此书以图像识别为主题,主要学习使用深度学习进行图像识别时所需的技术。自然语言处理或者语音识别等不是此书的讨论对象。
- 此书不介绍Caffe、TensorFlow、Chainer、Theano等深度学习框架的使用方法。
- 此书不介绍深度学习的详细理论,特别是神经网络的相关详细理论,不介绍用于提高识别精度的参数调优相关内容。
- 此书不涉及最新研究和理论细节,但读完本书后,读者应有能力进一步去阅读最新的论文或者神经网络相关的理论方面的技术书。
1. Python是什么
- Python是一个简单、易读、易记的编程语言,而且是开源的,对于首次接触编程的人士来说,Python是最合适的语言。
- Google、Microsoft、Facebook等战斗在IT行业最前沿的企业经常使用Python。
- 在科学领域,特别是在机器学习、数据科学领域,Python被大量使用。Python凭借着NumPy、SciPy等优秀的数值计算、统计分析库,在数据科学领域占有不可动摇的地位。深度学习的框架中也有很多使用Python的场景,比如Caffe、TensorFlow、Chainer、Theano等著名的深度学习框架都提供了Python接口。因此,学习Python对使用深度学习框架大有益处。
2. Python的安装
2.1 Python版本
本书使用Python 3.x。
2.2 使用的外部库
本书主要使用NumPy和Matplotlib。
- NumPy是用于数值计算的库,提供了很多高级的数学算法和便利的矩阵操作方法。本书将使用这些便利的方法来有效地促进深度学习的实现。
- Matplotlib是用来画图的库。使用Matplotlib能将实验结果可视化,并在视觉上确认深度学习运行期间的数据。
2.3 Anaconda发行版
Anaconda请安装3.x的版本。
3. Python解释器
-
在终端中**环境后,在终端中输入
python --version
命令,该命令会输出已经安装的Python的版本信息。 -
输入
python
,将会启动Python解释器。 -
Python解释器被称为“对话模式”。
-
Python属于“动态类型语言”,所谓动态,是指变量的类型是根据情况自动决定的。
-
关闭Python解释器时,Linux或Mac OS X 的情况下输入Ctrl+D;Windows的情况下输入Ctrl+Z,然后再按Enter键。
4. Python脚本文件
Python解释器是以对话模式执行程序,便于进行简单的实验,但想进行一连串的处理时,就不太方便。这时,可以将Python程序保存为文件(脚本文件),然后运行这个文件。
4.1 保存为文件
打开文本编辑器,新建一个hungry.py
的文件。文件内包含这样一段代码print(im hungry)
。接着打开终端,移动至hungry.py
的文件目录,然后输入python hungry.py
。这时,终端就会运行这个Python程序了。
4.2 类
- 如果用户自己定义类的话,就可以自己创建数据类型。此外,也可以定义原创的方法(类的函数)和属性。
- 类的格式如下
class 类名:
def __init__(self, 参数, ...): #构造函数
...
def 方法名1(self, 参数, ...): #方法1
...
def 方法名2(self, 参数, ...): #方法2
...
其中,名为__init__
的方法,是进行初始化的方法,也称为构造函数,只在生成类的实例(对象)时被调用一次。此外,在方法的第一个参数中明确地写入表示自身(自身的实例)的self
是Python的一个特点。
- 举一个简单的例子
class man:
def __init__(self, name):
self.name = name
print("Initialized")
def hello(self):
print("Hello" + self.name)
def goodbye(self):
print("Goodbye" + self.name)
运行完上述程序后,在IPython控制台中输入m = man("kkk")
创建实例,然后输入m.hello()
和m.goodbye()
来调用实例的两个方法。输出结果如下。
这里我们定义了一个类man,然后使用类man生成了实例(对象)m。类man的构造函数会接收参数name,然后用这个参数初始化实例变量self.name(实例变量的名字也可以写为self.n等,这样写的话,后面给实例变量赋值时也要写为self.n)。实例变量是存储在各个实例中的变量。Python中可以像self.name这样,通过在self后面添加属性名来生成或访问实例变量。
5. NumPy
在深度学习的实现过程中,经常会用到NumPy的数组类(numpy.array)中的方法来对数组和矩阵进行计算。
5.1 导入NumPy
- NumPy是外部库。这里所说的“外部”是指不包含在标准版Python中。因此,首先要导入NumPy库。导入语句为
import numpy
或者import numpy as np
。Python中使用import语句来导入库。这里的import numpy as np
的意思就是“将numpy作为np导入”。通过写成这样的形式,之后NumPy相关的方法均可通过np来调用。
5.2 生成NumPy数组
- 使用
np.array()
方法可生成NumPy数组。np.array()
接收Python列表作为参数,生成NumPy数组(numpy.ndarray
)(数据类型)。
5.3 NumPy的算术运算
- NumPy数组可进行对应元素(element-wise)的运算,需要注意的是,进行对应元素运算的两个数组的元素个数要求相同,可以对数组的各个元素进行算术运算。如果元素个数不同,程序将会报错。
- NumPy数组还可以和单一的数值(标量)组合起来进行运算。此时的运算是NumPy数组的各个元素和标量之间进行运算。此功能也被称为广播。
5.4 NumPy的N维数组
- NumPy除了可以生成一维数组,还可以生成多维数组(矩阵)。
上图中生成了2X2的矩阵A。并使用shape
方法查看了矩阵A的形状,通过dtype
方法查看了矩阵元素的数据类型。
- NumPy生成的矩阵还可以在相同形状的矩阵间进行对应元素的算术运算。并且,也可以通过标量(单一数值)对矩阵进行算术运算,这也是基于广播的功能。
- NumPy数组可以生成N维数组。数学上将一维数组称为向量, 将二维数组称为矩阵。另外,可以将一般化后的向量或矩阵等统一称为张量。在此书中,基本上将二维数组称为矩阵,将三维数组及三维以上的数组称为张量或多维数组。