又开一个新坑~~
因为确实很有必要好好地趁着这个热潮来研究一下深度学习,毕竟现在深度学习因为其效果突出,热潮保持高涨不退,上面的政策方面现在也在向人工智能领域倾斜,但是也有无数一知半解的人跟风吹捧,于是希望借此教程,让自己和读者一起借助keras,从上到下逐渐摸清楚深度学习领域的相关知识,包括它的前世今生,它的使用方法,它的应用领域等等。
该系列教程各部分链接:
深度学习框架Keras学习系列(一):线性代数基础与numpy使用
深度学习框架Keras学习系列(二):神经网络与BP算法
深度学习框架Keras学习系列(三):深度学习概念初探
另外,请先安装好python的jupyter notebook工具,后面的代码结果演示都将是基于jupyter notebook的,这样方便大家可以跟着运行程序看效果~~
线性代数基础
向量与矩阵
这个请看这篇博客OpenGL学习脚印: 向量和矩阵要点(math-vector and matrices)
重点在于了解向量与矩阵的基本概念,以及向量和矩阵的加减乘除运算规则。并且理解向量就是一种特殊的矩阵。
张量(Tensor)
这个请看这篇博客tensorflow中张量的理解
简而言之,张量是线性代数中的一种概念,它可以被理解为一个n维数组,它的描述单位是阶。我们规定,0阶的张量是标量(scalar,如1,4,23这样的数字),1阶张量是向量(vector,如[1,2]),2阶张量是矩阵(matrix,如[[1,2,3],[2,3,4]]),三阶张量[[[1,2],[3,4]],[[5,6],[7,8]]],以此类推。所以,张量实际是对数的表示的一种推广。
之所以要理解张量,是因为张量是tensorflow这个人工智能框架的基本元素,而keras实际上是在tensorflow与Theano(另一个相似框架,已经被维护者宣布不再继续支持)之上做了一层封装,使得我们可以很简单地通过keras的接口去建模,因此,当后面要了解人工智能算法的原理时,是绕不开对于tensorflow的理解的,也就绕不开对其核心计算元素张量的理解。(目前,我个人对为什么tensorflow要用张量作为运算元素的一个动机理解是,张量用于描述模型的输入特征值时,是非常合适的)。
Numpy
为什么用Numpy
Numpy是python中的一款高性能科学计算和数据分析的基础包,是Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list structure)结构要高效的多(该结构也可以用来表示矩阵(matrix))。据说NumPy将Python相当于变成一种免费的更强大的MatLab系统。
其内部工具包括:包括:1、一个强大的N维数组对象Array;2、比较成熟的(广播)函数库;3、用于整合C/C++和Fortran代码的工具包;4、实用的线性代数、傅里叶变换和随机数生成函数。numpy和稀疏矩阵运算包scipy配合使用更加方便。
NumPy(Numeric Python)提供了许多高级的数值编程工具,如:矩阵数据类型、矢量处理,以及精密的运算库。专为进行严格的数字处理而产生。多为很多大型金融公司使用,以及核心的科学计算组织如:Lawrence Livermore,NASA用其处理一些本来使用C++,Fortran或Matlab等所做的任务。
因为深度学习的运算中会涉及大量线性代数的运算,即向量与矩阵相关的一些运算,而Numpy中封装好了许多高效的线性代数运算方法,我们只需调用即可,多么方便。
Numpy的使用
一般来说,python中约定俗成的引入numpy的方式是:
import numpy as np
之后调用的时候,我们用np.方法名()就ok。
下面,我们从numpy中最常用的一些类来展开描述。
多维数组:ndarray
ndarray是numpy中数组的类,它是numpy最主要的一个构成要素(也被称为数组(array)),其本质是元素同质的多维数组,也可说是同类元素的一张表(一般元素是数字),索引任一元素的方式是通过一个元组来进行。而在numpy中,维度被称为“axes(轴)”,轴的数量成为“rank(阶)”。
比如说,一个3d空间中的点的坐标为[1,2,1]是一个阶为1的数组,因为它只有一个轴,而这个轴的长度为3. 而[[1,0,0],[0,1,2]]是一个二阶(2维的)的数组,它第一个维度(轴)的长度为2,第二个维度(轴)的长度为3.
ndarray的常用属性
- ndim:数组的轴(维度)的数量,即阶。
- shape:数组的维度。是一个表示数组在每个维度上的尺寸的元组。
- size:数组中的元素的总数量。
- dtype:描述数组元素类型的一个对象。
- itemsize:数组元素的大小(以字节为单位)。
- data:一个包含数组元素的缓冲区。
举例
>>> import numpy as np
>>> a = np.arange(15).reshape(3, 5)
>>> a
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
>>> a.shape
(3, 5)
>>> a.ndim
2
>>> a.dtype.name
'int64'
>>> a.itemsize
8
>>> a.size
15
>>> type(a)
<type 'numpy.ndarray'>
>>> b = np.array([6, 7, 8])
>>> b
array([6, 7, 8])
>>> type(b)
<type 'numpy.ndarray'>
Array的创建方法
- 用python的list作为参数传入numpy的array的构造函数中: