![Python深度学习:基于TensorFlow(第2版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/658/48593658/b_48593658.jpg)
1.1 把图像数字化
NumPy是Python的第三方库,若要使用它,需要先导入。
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/18_01.jpg?sign=1739312007-oSfeiwzP4ydHsQrYutKV93qwh2VRtABq-0-778a15de7b366e464b8e4e4cef6c3ddf)
导入NumPy后,可通过输入np.+Tab键查看可使用的函数。如果你对其中一些函数的使用方法不是很清楚,还可以通过运行“对应函数+?”命令的方式,看到使用函数的帮助信息。
例如,输入np.,然后按Tab键,将出现如图1-1所示界面。
运行如下命令,可查看函数abs的详细帮助信息。
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/18_02.jpg?sign=1739312007-UJxkUYmokSVqF6g1ZYy3ZFHQ9sgFs1oO-0-3df5abd018414109fb15ef036c8fffbd)
NumPy不但强大,而且非常友好。接下来我将介绍NumPy的一些常用方法,尤其是与机器学习、深度学习相关的一些内容。
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/18_03.jpg?sign=1739312007-azZhDSvl6Tl6BM2uZxtjcHXq7LRuxENS-0-d30d90cd8f90653861a459163420bf09)
图1-1 输入np.并按Tab键
前面提到,NumPy封装了一个新的多维数组对象ndarray。该对象封装了许多常用的数学运算函数,以便我们做数据处理、数据分析等。如何生成ndarray呢?这里介绍几种生成ndarray的方式,如从已有数据中生成,利用random模块生成,使用arange、Linspace函数生成等。
机器学习中的图像、自然语言、语音等在输入模型之前都需要数字化。这里我们用cv2把一个汽车图像转换为NumPy多维数组,然后查看该多维数组的基本属性,具体代码如下:
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/18_04.jpg?sign=1739312007-At1OLfUyltOaLRnu4bIhFiiwmSJvaR4b-0-02818d5be2a33de5390491d62831f3ce)
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/19_01.jpg?sign=1739312007-tzu6rPc9j6MhK0uazz34tdCz2Oh1R0Ui-0-3874c3215546dcd1444ecc39e96f9a0a)
运行结果如下,效果如图1-2所示。
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/19_02.jpg?sign=1739312007-UXYQ7qeK4WMlLpoQSndAZkbS4NKC6CzS-0-8128cfbec140ac5616015a997f3fc580)
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/19_03.jpg?sign=1739312007-WZWW9tV2Zn7cSg8MZ31T0UjAEkK0vWo2-0-a69ab98552c5fdf1c4a2828a01d3690b)
图1-2 把汽车图像转换为NumPy数组
1.1.1 数组属性
在NumPy中,维度被称为轴,比如我们把汽车图像转换为一个NumPy 3维数组,这个数组中有3个轴,长度分别为675、1200、3。
NumPy的ndarray对象有3个重要的属性,分析如下。
❑ndarray.ndim:数组的维度(轴的个数)。
❑ndarray.shape:数组的维度,它的值是一个整数元祖。元祖的值代表其所对应的轴的长度。比如对于2维数组,它用来表达这是几行几列的矩阵,值为(x,y),其中x代表这个数组有几行,y代表有几列。
❑ndarray.dtype:描述数组中元素的类型。
比如上面提到的img数组:
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/19_04.jpg?sign=1739312007-PcMrPcz4tlFDiCmtOnBQK0qFEqEwbj1F-0-b0d58d3173a71e38532881401818a8b1)
为更好地理解ndarray对象的3个重要属性,我们对1维数组、2维数组、3维数组进行可视化,如图1-3所示。
1.1.2 从已有数据中生成数组
直接对Python的基础数据类型(如列表、元组等)进行转换来生成数组。
1)将列表转换成数组。
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/19_05.jpg?sign=1739312007-c0m2yeKpgtqJoSNenPqeAhOiANJ9TtdY-0-1b90756fe11f3e591ee3855aff5952ad)
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/20_01.jpg?sign=1739312007-xg0ztdT3tlXjcKEmdLVClY5xTkTKsygZ-0-54f8841b0d654755de8aed95e01c4d84)
图1-3 多维数组的可视化表示
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/20_02.jpg?sign=1739312007-517I34bF0BkOt5XN4CSn94Forsug9FQm-0-c5d35961f1911830e8a7db76d7fd192c)
2)将嵌套列表转换成多维数组。
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/20_03.jpg?sign=1739312007-qJzZOh7KvhsygwpHa1DP9sDjW0bQXLYT-0-84a66ccc15e79a8ac409da1b2635a3dc)
如果把上面示例中的列表换成元组,上述的转换方法也同样适用。
1.1.3 利用random模块生成数组
在深度学习中,我们经常需要对一些参数进行初始化。为了更有效地训练模型,提高模型的性能,有些初始化还需要满足一定条件,如满足正态分布或均匀分布等。这里我们先来看看np.random模块常用函数,如表1-1所示。
表1-1 np.random模块常用函数
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/21_01.jpg?sign=1739312007-I82N8M1vgv2PyUKy2fBxgGjMCDIPKehu-0-43ed39a3e24050de5144a8208aec7b41)
下面我们来看看一些函数的具体使用方法:
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/21_02.jpg?sign=1739312007-lDU7KZssmB2iisJ0qOX6c31f4auQCAcg-0-47cc681eb11ee6346b0f648335c09122)
运行结果如下:
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/21_03.jpg?sign=1739312007-kwri8KNSINMyTEtvBdtRgK2UwQRipO4h-0-50aeebf5b81829389c99de7a1c663bf3)
用以上方法生成的随机数是无法重现的,比如调用两次np.random.randn(3, 3),输出同样结果的概率极低。如果我们想要多次生成同一份数据,应该怎么办呢?可以使用np.random.seed函数设置种子。设置一个种子,然后调用随机函数产生一个数组,如果想要再次得到一个一模一样的数组,只要再次设置同样的种子就可以。
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/22_01.jpg?sign=1739312007-hNKYsmjLTWoc0CGYrf2bpKX22bzpByM7-0-92a709aac76dfa0a75de2c5faf40a2c4)
运行结果如下:
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/22_02.jpg?sign=1739312007-kvIAOPLhDHxmk5gs1ENQfO8H0QC4ATf4-0-bc36e33cafd9560c6382bf9a9266e9e0)
1.1.4 利用arange、linspace函数生成数组
有时,我们希望用到具有特定规律的一组数据,这时可以使用NumPy提供的arange、linspace函数来生成数组。
arange是numpy模块中的函数,其格式为:
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/22_03.jpg?sign=1739312007-5gT43RsgqRKgcmVlniLnOeq6bZE5tK03-0-aef67f44d1c6d71d9e7a9bdf69c697be)
其中start与stop用于指定范围,step用于设定步长,生成1个ndarray。start默认为0,step可为小数。Python的内置函数range的功能与此类似。
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/22_04.jpg?sign=1739312007-zHRsOylV2lakoWDM8XiPF6SThbdtGEnK-0-08a9278ede747e014588a96669c01c71)
linspace也是numpy模块中常用的函数,其格式为:
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/22_05.jpg?sign=1739312007-P0WHZCSgRv5XFXIxaniyG7XHJNjPUOme-0-0aedcce059e76040702a67b1a3bc37f8)
它可以根据输入的指定数据范围以及等份数量,自动生成一个线性等分向量,其中endpoint(包含终点)默认为True,等分数量num默认为50。如果将retstep设置为True,则会返回一个带步长的数组。
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/23_01.jpg?sign=1739312007-JWb61ekUFxkdrtXPLz03rg2FFpWetBsX-0-a097512250133e2786e6d25abfb4634d)
值得一提的是,这里并没有像我们预期的那样生成0.1, 0.2, …, 1.0这样步长为0.1的数组,这是因为linspace必定会包含数据起点和终点,那么其步长为(1-0)/9=0.11111111。如果需要产生0.1, 0.2,…, 1.0这样的数据,只需要将数据起点0修改为0.1即可。
除了上面介绍的arange和linspace函数,NumPy还提供了logspace函数,该函数的使用方法与linspace的使用方法一样,读者不妨自己动手试一下。