深度学习概念
深度学习 (deep learning):深度学习是机器学习中的一个分支,试图通过具有多个处理层的计算模型对数据进行多层抽象。这个抽象的结果即是数据一种表达,而深度学习也可看成表达学习(表征学习)的一种方法,深度学习的好处是用无监督式 Unsupervised或半监督式 Semi-supervised的特征学习和分层特征提取
高效算法来替代手工获取数据特征。
简单来说,深度学习可以理解为具有很多层(>2)的人工神经网络模型算法,神经网络的构建其实也可以看成一个点-线-面的构造过程。
- 点:即神经网络里许多计算节点(在神经网络里,称为神经元 Cell),
- 线:由一些节点再构成一层处理层(这一层就可以理解为对数据的某个抽象表达),
- 面:由多个处理层构建起来就形成了一个神经网络。
再由点(神经元,Cell)不同,或是这些点的连接方式不同就可以形成各种各样的不同的表达模型。如下图所示,我们可以看到许多种神经网络结构,例如:Deep Feed Forward深度前向传播网络,Recurrent Neural Network(RNN)递归神经网络和Long/Short Term Memory(LSTM)长短期记忆神经网络。
![](https://dn-anything-about-doc.qbox.me/document-uid291340labid2487timestamp1483688093630.png/wm)
图片来自:THE ASIMOV INSTITUTE
项目简介
这个课程主要是引导大家入门TensorFlow、Theano、Keras 及 Caffe 几个主流的深度学习框架。在课程中有关各种算法的详细推导及思想我们不会做过多的陈诉,旨在通过让同学们动手操作搭建自己的神经网络模型,了解如何使用这些框架解决实际问题。
课程会基于每个框架的官方文档,先带大家熟悉框架中基本的定义语法及常用函数(可看成深度模型的小零件),每个实验最后都会综合这些零件搭建一个简易的神经深度网络模型。
这个项目十分适合具有一定python编程基础,对人工智能、深度学习感兴趣的同学。
需要预先有了解的知识点:
- Tensor: 张量,经典的方法把张量视为多维数组,它们是标量,1维向量和2维矩阵的n维推广。张量的”分量”是数组中的值。 这个思想可以进一步推广到张量场,那里张量的元素是函数,甚至微分。 —— 引自维基百科
- GPU:graphics processing unit,图形处理器
- Numpy:python中有关数值计算的库
- Matrix conventions (矩阵约定) for machine learning :矩阵中的每行都是一个例子。如 一个10行5列的矩阵inputs[10,5], 代表着10个5维的实例。
- Broadcasting: Numpy进行数值运算时广播不同维度的矩阵。如,当一个较小的矩阵a(1∗2维)与一个较大的矩阵b(2∗3 维)进行乘法运算时,numpy会将矩阵a广播为与矩阵b兼容的矩阵维度,再进行运算。也可通过下图帮助理解。
![](https://dn-anything-about-doc.qbox.me/document-uid291340labid2487timestamp1483688106015.png/wm)
Theano介绍及安装
Theano是一个较为老牌和稳定的机器学习python库之一。Theano基于Python擅长处理多维数组(紧密集成了Numpy
),属于比较底层的框架,theano起初也是为了深度学习中大规模人工神经网络算法的运算所设计,我们可利用符号化式语言定义想要的结果,接着theano会对我们的程序进行编译,使其高效运行于GPU或CPU。
从Theano官方文档的欢迎页面上,我们可以看到其对Theano的特征介绍:
- tight integration with Numpy (紧密集成Numpy) —— 在Theano编译函数中使用numpy.ndarray
- transparent use of a GPU (GPU的透明使用) —— 使得其对浮点数的运输非常高速
- efficient symbolic differentiation (高效的符号分解) —— 也是Theano的发明初衷之一,可帮我们推导我们所定义的一个或多个输入的函数
- speed and stability optimizations (快速且稳定的优化) —— 在函数表达式 log(1+x) 中即使 x 非常小,也可以给出精确的答案
- dynamic C code generation (动态生成C代码) —— 使得表达式求值(evaluate expression)更加快速
- extensive unit-testing and self-verification (大量的单元测试及自我验证) —— 可检测及诊断许多类型的错误
在Installing Theano中可查看在各种系统上安装Theano的教程。这里我们将展示在实验楼的ubantu14.04环境的安装过程:
# 1. 先使用apt-get update命令进行更新,避免安装Python库时出现问题
$ sudo apt-get update
![](https://dn-anything-about-doc.qbox.me/document-uid291340labid2487timestamp1486976846556.png/wm)
Theano基本使用
Theano的基本运算及符号表达
通过python进入Python终端中,先导入theano的相关模块以便后续操作:
>>> import theano
>>> import theano.tensor as T
>>> from theano.tensor import *
>>> from theano import shared
>>> import numpy as np
![](https://dn-anything-about-doc.qbox.me/document-uid291340labid2487timestamp1485213155711.png/wm)
基本的张量功能:
Theano 支持Python中任何类型的对象,但它的核心是其支持符号矩阵表达式,如下例中:
>>> x = T.fmatrix()
x是一个TensorVariable张量变量的实例,T.fmatrix对象本身也是TensorType张量类型的一个实例。
Creation创造张量实例:
Theano提供了一列预先定义好的张量类型可供使用者很方便地创造张量变量,所有的张量构造函数都接收一个 可选 的输入参数name。如以下便构造了三个以myvar为名字的 0维整型标量(scalar)变量
>>> x = T.scalar('myvar', dtype='int32')
>>> x = iscalar('myvar')
>>> x = TensorType(dtype='int32', broadcastable=())('myvar')
还可以通过vector、row、col、matrix、tensor3及tensor4分别构造向量、行向量、列向量、矩阵、三维张量及四维张量。
我们还可以通过以下方式创造张量类型实例
# 创造一个双精度浮点类型的无名矩阵
>>> x = dmatrix()
# 创造了一个双精度浮点类型的名为'x'的矩阵
>>> x = dmatrix('x')
# 创造了一个双精度浮点类型的名为'xyz'矩阵
>>> xyz = dmatrix('xyz')
![](https://dn-anything-about-doc.qbox.me/document-uid291340labid2487timestamp1485213235827.png/wm)
Plural Constructor 多输出构造函数:
Plural Constructor可以同时构造多个变量,以下便是Theano提供的多输出构造函数,其实就是int,long, float及double数据类型与标量scalars, 向量vectors, 行向量rows, 列向量cols和矩阵matrices的组合:
- 返回一个或多个标量:iscalars, lscalars, fscalars, dscalars
- 返回一个或多个向量:ivectors, lvectors, fvectors, dvectors
- 返回一个或多个行变量:irows, lrows , frows, drows
- 返回一个或多个列变量:icols, lcols, fcols, dcols
- 返回一个或多个矩阵: imatrices, lmatrices, fmatrices, dmatrices
举一个’栗子’:
# 构造三个无名双精度浮点类型矩阵
>>> x, y, z = dmatrices(3)
# 构造三个分别名为'x','y','z'的double类型矩阵
>>> x, y, z = dmatrices('x', 'y', 'z')
![](https://dn-anything-about-doc.qbox.me/document-uid291340labid2487timestamp1485213254960.png/wm)
依次类推,Theano中还有其他的张量类型,除前边的章节介绍外的还有字节型byte,字型word和复数型complex的数据形成的张量。
自定义张量类型:
如果上述所提供的构造函数不能构造出你想要的张量时,你可以自定义自己的张量类型TensorType
。比如,构造一个5维张量:
>>> dtensor5 = TensorType('float64', (False,)*5)
>>> x = dtensor5()
>>> z = dtensor5('z')
![](https://dn-anything-about-doc.qbox.me/document-uid291340labid2487timestamp1485213269295.png/wm)
也可以重定义已经提供的张量构造函数。如重构一个 双精度浮点类型矩阵:
>>> my_dmatrix = TensorType('float64', (False,)*2)
>>> x = my_dmatrix() #构造一个无名2维矩阵实例
## 判断自定义的张量类型是否与theano库所提供的构造函数一致
>>> my_dmatrix == dmatrix
![](https://dn-anything-about-doc.qbox.me/document-uid291340labid2487timestamp1485213287665.png/wm)
Theano中的线性运算
在进行线性运算前,先从theano中导入一个新的函数function:
>>> from theano import function
使用Theano进行线性运算过程就跟把大象放进冰箱的步骤差不多:
- 打开冰箱——定义好需要进行运算的张量变量
- 把大象放进冰箱——利用已定义的张量书写你的表达式
- 关上冰箱——将表达式转化为可执行的python函数
基于以上三个步骤我们实现两个张量的加运算:
# 1. 定义变量,可以是3.1节介绍的张量类型中的任一种,这里我定义的是double scalar双精度标量
>>> x = T.dscalar('x')
>>> y = T.dscalar('y')
# 或者你可以直接同时定义这两个变量
>>> x, y = T.dscalars('x', 'y')
# 2. 表达式
>>> z = x + y
# 3. 将表达式转化为可执行的python函数
>>> f = function([x, y], z)
![](https://dn-anything-about-doc.qbox.me/document-uid291340labid2487timestamp1485213319688.png/wm)
第3个步骤中的function函数,其接受的第一个参数类型为 a list of Variables 一组输入变量 ,将作为转化后的python函数f的输入,第二个参数类型为 a single Variable or a list of variables一个或一组变量,将作为函数f的输出。
接下来我们就可以使用函数f进行表达式运算
>>> f(2.33, 6.66)
![](https://dn-anything-about-doc.qbox.me/document-uid291340labid2487timestamp1485213343398.png/wm)
如果你想在函数f中只个一个输入,而执行加运算。那么可以设置其中一个变量有缺省值 Default Value
>>> from theano import In
>>> f = function([x, In(y, value=1)], z)
# In理解为Instance实例
>>> f(1.33)
![](https://dn-anything-about-doc.qbox.me/document-uid291340labid2487timestamp1485213352446.png/wm)
还有些时候,我们会在许多函数间用到同一个变量值,那么此时我们可以定义一个共享变量(shared Variable), 共享变量由使用其计算的函数所共享,可通过shared_constructor()构造,可通过get_value和set_value函数分别获得和改变共享变量的值。
>>> np_array = np.zeros(2, dtype='float32')
# 创建共享变量
>>> shared_default = shared(np_array)
>>> shared_false = shared(np_array, borrow=False)
>>> shared_true = shared(np_array, borrow=True)
![](https://dn-anything-about-doc.qbox.me/document-uid291340labid2487timestamp1485213366077.png/wm)
shared函数中的参数borrow的含义是,变量np_array在函数中被使用时所创建共享变量shared_xxx,在np_array的值发生改变时共享变量是否要跟着发生变化,同学们可通过运行下边的代码获得答案:
>>> np_array += 1 #在数组np_array[0, 0]的值上加1
>>> shared_default.get_value()
>>> shared_false.get_value()
>>> shared_true.get_value()
![](https://dn-anything-about-doc.qbox.me/document-uid291340labid2487timestamp1485213376353.png/wm)
练习
经过上边的介绍,我们来实现以下表达式:
- 向量x的表达式
x+x10 - 矩阵x的表达式 s(x)=11+e−x
- 基于表达式2实现 s(x) 的导数形式
# 表达式1
>>> x = T.vector()
>>> y = x + x ** 10
>>> f = function([x], y)
>>> f([0, 1, 2])
![](https://dn-anything-about-doc.qbox.me/document-uid291340labid2487timestamp1485213389404.png/wm)
# 表达式2
>>> x = T.dmatrix('x')
>>> s = 1 / (1 + T.exp(-x))
>>> logistic = function([x], s)
>>> logistic([[0 , 1], [-1, -2]])
![](https://dn-anything-about-doc.qbox.me/document-uid291340labid2487timestamp1485213397254.png/wm)
#表达式3
>>> s = T.sum(1 / (1 + T.exp(-x)))
>>> gradS = T.grad(s, x)
>>> dLogistic = function([x], gradS)
>>> dLogistic([[0, 1], [-1, -2]])
![](https://dn-anything-about-doc.qbox.me/document-uid291340labid2487timestamp1485213407414.png/wm)
结束之后,利用Ctrl + D退出python终端
Theano实现自编码器
关于 Theano实现自编码器 的详细步骤以及代码详解,点击【深度学习初探——入门DL主流框架】即可进行查看了~
后续的DL框架:
- TensorFlow介绍及简单应用
- Keras介绍及手写数字体识别应用
- Scikit-Learn模型&Keras混合应用
- Keras搭建卷积神经网络CNN模型
- Keras实现简单递归神经网络RNN模型
- Caffe 介绍 & Caffe实现深度神经网络
- Caffe实现卷积神经网络模型
点击【深度学习初探——入门DL主流框架】即可学习了。
</div>