深度学习入门基于Python的理论与实现_第一章_Python入门(原创笔记)
前言此书使用Python作为编程语言,尽可能地少使用外部库,从零开始实现深度学习的程序。此书从简单的机器学习问题开始,最终实现一个能高精度地识别图像的系统。此书以图像识别为主题,主要学习使用深度学习进行图像识别时所需的技术。自然语言处理或者语音识别等不是此书的讨论对象。此书不介绍Caffe、TensorFlow、Chainer、Theano等深度学习框架的使用方法。此书不介绍深度学习的详细理论,特
前言
- 此书使用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.txt
的文件,在文件内输入这样一段代码print("im hungry")
,然后将此文件的名称改为hungry.py
。接着打开终端,移动至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维数组。数学上将一维数组称为向量, 将二维数组称为矩阵。另外,可以将一般化后的向量或矩阵等统一称为张量。在此书中,基本上将二维数组称为矩阵,将三维数组及三维以上的数组称为张量或多维数组。
5.5 广播
- NumPy中,形状不同的数组之间也可以进行运算。
- 例如,在5.4中的矩阵A和标量10进行了乘法运算,在这个过程中,标量10被扩展成2X2的形状,然后再与矩阵A进行乘法运算。这种运算方法就称为广播
- 而且,不同形状的数组之间也可以进行运算。
5.6 访问元素
-
元素的索引从0开始,可按如下方法进行索引
-
除此之外,NumPy还可以使用数组访问各个元素
列表类型的数组也是可以用来访问元素的。
-
若要获取满足一定条件的元素,可使用布尔型数组。
同理,列表类型的布尔型数组也可用来访问元素
6. Matplotlib
在深度学习的实验中,图形绘制与数据可视化非常重要。Matplotlib是用于绘制图形的库,使用Matplotlib可以实现图形的绘制与数据的可视化。
6.1 绘制简单图形
- 可以使用matplotlib中的pyplot模块来绘制图形。例如绘制函数y = sin(x)
首先使用NumPy中的arange方法生成步长为0.1,范围0到6的数组x(不包括6),然后利用NumPy中的sin函数,以x为参数,生成y。最后把x和y作为参数传递给pyplot中的plot方法来绘制图形,最后使用plt.show
来显示绘制的图形。
6.2 pyplot的功能
- pyplot可以对线的形式、颜色等进行修改,还可以对图形添加标签和标题等。
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(0, 6, 0.1)
y1 = np.sin(x)
y2 = np.cos(x)
plt.plot(x, y1, label = "sin")
plt.plot(x, y2, linestyle = "--", label = "cos") # 用虚线绘制
plt.xlabel("x") # x标签
plt.ylabel("y") # y标签
plt.title("sin & cos") # 标题
plt.legend()
plt.show()
6.3 显示图像
- pyplot模块还可以实现读取图像与显示图像的功能。
使用matplotlib.image模块的imread()方法读取图像,使用matplotlib.pyplot模块的imshow()方法显示图像。
import matplotlib.pyplot as plt
from matplotlib.image import imread
img = imread(r"E:\1_study_postgraduate\deep_learning_from_scratch\code\ch1\welcome.gif")
plt.imshow(img)
plt.show()
- 这里解释一下为什么用到了两种导入的方法。
import matplotlib.pyplot as plt
:这行代码的意思是,导入matplotlib包里面的pyplot模块,并把pyplot模块的名字给等价为plt,这样做的好处就是在后面写代码的时候,就可以用plt三个字母来代替pyplot六个字母。因此,我们在主程序中用到的pyplot模块内的两个方法时,就可以直接通过plt.imshow(img)
和plt.show()
来调用。from matplotlib.image import imread
:这行代码的意思是,从matplotlib.image模块中导入imread()方法,当然也是仅仅导入imread()方法,这就意味着matplotlib.image模块中的其他方法在本程序中是不能调用的。如果是通过这种方式来导入方法的话,就可以直接在程序中输入方法的名字来使用该方法,类似于imread(r"E:\1_study_postgraduate\deep_learning_from_scratch\code\ch1\welcome.gif")
,而不需要先加模块名再引用方法,类似于plt.imshow(img)
。
- 所以,正是因为主程序中用到了pyplot模块中的两个方法,为了方便起见,该程序的编写者采用了
import matplotlib.pyplot as plt
这一导入方式。 - 知道了这两种导入方法的区别后,就可以自己来改一改上面的代码了,下面是我改的代码
from matplotlib.image import imread
from matplotlib.pyplot import imshow
from matplotlib.pyplot import show
img = imread(r"E:\1_study_postgraduate\deep_learning_from_scratch\code\ch1\welcome.gif")
imshow(img)
show()
6.4 补充知识:Python中的包、模块、方法的逻辑关系
- 首先给出它们三个的结构关系:包→模块→方法,对应于英文就是:package→module→function。
- 包(package):包是一个类似文件夹的东西,它里面包含了很多.py文件还有一个__init__.py文件,init.py这个文件是描述有多少个模块的东西。该目录下一定得有这个__init__.py文件和其它模块或子包。
下图就是matplotlib包的文件结构。
- 模块(module):在Python中一个.py文件就可以称为一个模块,其表达的含义是实现了某个功能。
下图中橙色箭头所指的就是matplotlib包中的pyplot模块
- 方法(function):方法其实就是定义在一个模块里面的一个函数,因为function翻译为中文后可以叫方法,也可以叫函数,所以今后在文章中提到的方法或者函数,指的都是同一个东西。
下图为matplotlib包里的pyplot模块内的plot()方法的定义。
7. 小结
- 本章重点介绍了实现深度学习(神经网络)所需的编程知识,以为学习深度学习做好准备。
- 想进一步了解Python,可以参考下面这些图书。
《 Python语言及其应用》:这是一本详细介绍从Python编程的基础到应用的实践性的入门书。
《利用Python进行数据分析》:对NumPy进行了简单易懂的总结。
此外,“Scipy Lecture Notes” 这个网站上也有以科学计算为主题的NumPy和Matplotlib的详细介绍。
下载地址:
- 《 Python语言及其应用》:
链接:https://pan.baidu.com/s/13yyzNKKYIggSKDNKZS4kpw
提取码:lzpj
复制这段内容后打开百度网盘手机App,操作更方便哦 - 《利用Python进行数据分析》:
还未更新。
更多推荐
所有评论(0)