Theano深度学习(一)---- 安装与使用

/* Author: cyh_24 */

/* Date: 2014.10.2 */

/* Email: [email protected] */

/* More: http://blog.csdn.net/cyh_24 */

最近,研究的关注点在以图搜图 这块,近期这块内容的比赛较多,为了不拖师兄的后腿太多,决定潜心研究DeepLearning,主要以Theano官方教程Deep Learning Tutorial为参考。

这个系列的博客应该会持续更新,希望大家多多指点,共同学习!

转载请注明:http://blog.csdn.net/cyh_24/article/details/41827691

1. 下载代码与数据

Theano官方提供了学习用的全部代码和数据集

你可以从githubclone下来:

git clone git://github.com/lisa-lab/DeepLearningTutorials.git

2. 数据集的使用

2.1 MNIST DataSet

(mnist.pkl.gz)

mnist 数据集由手写数字图像组成,分成60,000个训练样本和10,000测试样本。

在许多论文,与这个教程一样,官方的60,000训练样本分成50,000个训练样本和10,000个验证样本

验证样本:用于选择像学习率和模型大小的超参数)

所有手写数字图像大小都归一化在固定的28*28大小的灰度图像中。

这里有一些MNIST手写数字的例子:

2.2 使用数据集

你可以通过下面的代码进行导入数据:
import cPickle, gzip, numpy
# Load the dataset
f = gzip.open(’mnist.pkl.gz’, ’rb’)
train_set, valid_set, test_set = cPickle.load(f)
f.close()

值得注意的是,当我们使用这些数据集的时候,我们通常是把它们分成多个小块(称为minibatcheds)。并且,官方建议我们在读入数据之后,应该把数据存储到共享变量(shared variables)中。使用共享变量的理由与使用GPU有关。当拷贝数据到GPU内存时,从CPU拷贝数据到GPU是个大的效率瓶颈。当代码要做拷贝数据,如果没有使用共享变量,因为这个瓶颈,GPU代码不会比CPU代码快(甚至可能更慢)。

使用共享变量的方法如下:
def shared_dataset(data_xy):
    data_x, data_y = data_xy
    shared_x = theano.shared(numpy.asarray(data_x, dtype=theano.config.floatX))
    shared_y = theano.shared(numpy.asarray(data_y, dtype=theano.config.floatX))

    return shared_x, T.cast(shared_y, ’int32’)

#使用共享变量
test_set_x, test_set_y = shared_dataset(test_set)
valid_set_x, valid_set_y = shared_dataset(valid_set)
train_set_x, train_set_y = shared_dataset(train_set)
batch_size = 500 # size of the minibatch
# accessing the third minibatch of the training set
data = train_set_x[2 * 500: 3 * 500]
label = train_set_y[2 * 500: 3 * 500]

注意:

  1. 如果你在GPU上运行,使用的数据集超出内存的大小,代码会崩溃。这种情况下,需要把数据保存到共享变量。
  2. 在训练数据的时候,你可以保存为足够小的数据块到共享变量。一旦你通过数据块获取数据,需要保存更新的值。
  3. 这个方法能够使CPU和GPU内存之间的数据传输效率最大化。

3. 约定的名称

3.1 数据集名词

分别代表训练集、验证集、测试集。

对于每个数据集,由数据x跟标签y组成:

3.2 数学定义

3.3 符号跟缩略语

4. DeepLearning的监督学习入门

Deep Learning 最令人兴奋的一点事它使用大量的非监督式来学习神经网络。但是,监督式学习仍然在其中扮演了重要的角色。一般来说,无监督学习到的东西,在监督学习的微调之后能够达到更好的效果。这节的监督学习入门主要介绍一下几个方面:

  1. 简单介绍监督学习在分类模型中的作用
  2. 介绍 批量随机梯度下降算法

4.1 学习一个分类器

4.1.1 Zero-One Loss

训练分类器的目的是将分类的错误(Zero-One Loss)尽可能减小。

如果预测函数 是:

那么它的错误代价 就是:

在这里,D是训练集,I 的意义如下:

当x为True的时候,它为1;否则为0

在本教程中,f(预测函数) 定义如下:

我们可以用Theano来写出上面的代码:

zero_one_loss = T.sum(T.neq(T.argmax(p_y_given_x), y))

4.1.2 Log-Likelihood Loss(负对数似然代价函数)

因为Zero-One Loss是非可微分的,为了在大模型(成千上万的参数)中优化它,计算量相当惊人。因此,我们用Log-Likelihood Loss来代替:

同样,也是通过最小化这个似然函数来得到优化,最小化的过程我们成为NLL(negative log-likelihood),如下:

同样,用Theano写出的代码仍然很简单:

NLL = -T.sum(T.log(p_y_given_x)[T.arange(y.shape[0]), y])

4.2 Stochastic Gradient Descent (随机梯度下降)

普通的梯度下降法

梯度下降法,就是利用负梯度方向来决定每次迭代的新的搜索方向,使得每次迭代能使待优化的目标函数逐步减小。

普通梯度下降法的伪代码

# GRADIENT DESCENT
while True:
    loss = f(params)
    d_loss_wrt_params = ... # compute gradient
    params -= learning_rate * d_loss_wrt_params
    if <stopping condition is met>:
    return params

随机梯度下降法

随机梯度下降是每次通过一个样本(而不是整个训练集)来迭代更新一次,如果样本量很大的情况(例如几十万),那么可能只用其中几万条或者几千条的样本,就已经将theta迭代到最优解了。

但是,SGD伴随的一个问题是噪音较多,使得SGD并不是每次迭代都向着整体最优化方向。

SGD伪代码如下

# STOCHASTIC GRADIENT DESCENT
for (x_i,y_i) in training_set:
    # imagine an infinite generator
    # that may repeat examples (if there is only a finite training loss = f(params, x_i, y_i)
    d_loss_wrt_params = ... # compute gradient
    params -= learning_rate * d_loss_wrt_params
    if <stopping condition is met>:
    return params

批量随机下降法

Theano深度学习教材中推荐的是随机梯度下降的一个优化的变种,叫做批量随机下降(Minibatch SGD)。批量随机下降的基本工作原理跟随机下降一样,只是,每次使用了更多的训练样本来估计梯度。 这有效的减少了估计梯度的方差,同时更好地利用了计算机内存。

MSGD伪代码如下:

for (x_batch,y_batch) in train_batches:
    # imagine an infinite generator
    # that may repeat examples
    loss = f(params, x_batch, y_batch)
    d_loss_wrt_params = ... # compute gradient using theano
    params -= learning_rate * d_loss_wrt_params
    if <stopping condition is met>:
        return params

注意:

在这里,批的大小B是一个权衡的选择,需要考虑模型、数据集、硬件等;文本选择的是20,当然你可以任意选取(不会对结果正确性些有影响)。

但是,如果你的训练次数是固定的,那么批的大小将会对结果产生影响。

下面,我们用Theano写出一个完整的MSGD:

# Minibatch Stochastic Gradient Descent
# assume loss is a symbolic description of the loss function given
# the symbolic variables params (shared variable), x_batch, y_batch;
# compute gradient of loss with respect to params
d_loss_wrt_params = T.grad(loss, params)
# compile the MSGD step into a theano function
updates = [(params, params - learning_rate * d_loss_wrt_params)]
MSGD = theano.function([x_batch,y_batch], loss, updates=updates)
for (x_batch, y_batch) in train_batches:
    # here x_batch and y_batch are elements of train_batches and
    # therefore numpy arrays; function MSGD also updates the params
    print(’Current loss is ’, MSGD(x_batch, y_batch))
    if stopping_condition_is_met:
        return params

4.3 规则化

批量随机梯度下降是一个线性更新的算法,可以使用新的样本来训练已有的模型。这方便,但是会出现一种过拟合的可能。为了防止过拟合的出现,我们可以使用两个方法:

  1. 规则化的方法;
  2. 训练到一定时间提早结束;

4.3.1 规则化

L1和L2的规则化方法是通过向代价函数中增加一个新的惩罚项,用来惩罚一些参数配置(规则化也叫做权值衰减)

一般情况下,如果我们的代价函数如下:

那么,经过规则化后的代价函数就是:

我们的例子中,规则化后的代价函数式:

原则上,当添加一个规则化到代价函数中,会使得神经网络的映射更加平滑(通过惩罚值大的参数,这将减少网络模型的非线性)。

看看python中的实现:

# symbolic Theano variable that represents the L1 regularization term
L1 = T.sum(abs(param))
# symbolic Theano variable that represents the squared L2 term
L2_sqr = T.sum(param ** 2)
# the loss
loss = NLL + lambda_1 * L1 + lambda_2 * L2

4.3.2 提早结束

验证集: 没有被用于梯度下降训练,也不是测试集的一部分。可以认为它是测试的代表。

我们可以通过验证集来验证模型的性能,来判断是否出现过拟合的情况。如果模型的性能在验证集中没有明显的提升,或者甚至下降了,那么我们应该停止继续迭代。

5 介绍语

python 这么优雅,Theano 这么‘库’,deep-learning 这么潮,不多说了,我也提早结束吧......

时间: 2024-08-01 15:18:03

Theano深度学习(一)---- 安装与使用的相关文章

基于scikitlearn的深度学习环境安装(三)(完整版)

OS Linux  Ubuntu14.04 安装 pip (python2.7.9或以上自带pip) sudo apt-get install python-pip pip是python环境下安装包的总的管理工具 相对于easy install使用更加的方便一些 尝试安装scikit-neuralnetwork  需要theano  scipy  numpy sudo  pip install scikit-neuralnetwork(出现错误  无法编译 先尝试下面一步) sudo apt-g

1.深度学习之安装教程

在centos5下安装TensorFlow. 步骤: 1.安装python3.5 2.安装pip3,同时建立软链接. 3.安装TensorFlow,pip install --upgrade tensorflow 出现问题: 1./lib64/libc.so.6:version GLIBC_2.14not found 解决办法:

深度学习--torch安装

一.查看cuda及cudnn版本 cat /usr/local/cuda/version.txt cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2 二.官网链接 http://pytorch.org/ 支持三种安装方式,conda,pip 以及source

[深度学习]TensorFlow安装

virtualenv 可以用来建立一个专属于项目的python环境,保持一个干净的环境.只需要通过命令创建一个虚拟环境,不用的时候通过命令退出,删除.实践证明用虚拟环境能避免很多糟心的事. 下面介绍一下安装方法: 安装 virtualenv; 安装 virtualenvwrapper; 安装 Numpy,Scipy,Matplotlib 等Python科学计算的库; 1.安装 virtualenv $ sudo pip install virtualenv 然后建立一个测试目录: $ mkdir

手把手教你搭建深度学习平台——避坑安装theano+CUDA

python有多混乱我就不多说了.这个混论不仅是指整个python市场混乱,更混乱的还有python的各种附加依赖包.为了一劳永逸解决python的各种依赖包对深度学习造成的影响,本文中采用python的发行版Anaconda. Step1 安装Anaconda 这里不建议使用python3.4以后的Anaconda版本,因为太新的版本(python3.5)不支持python/matlab混合编程.所以为了以后方便,建议使用python2.7的Anaconda版本.Anaconda安装完成后,n

64位Win7下安装并配置Python3的深度学习库:Theano

注:本文全原创,作者:ZMAN  (http://www.cnblogs.com/zmanone/) 这两天在安装Python的深度学习库:Theano.尝试了好多遍,CMake.MinGW.BLAS.APLACK等等都装了试着自己编译,网上教程也搜了一大堆,但都没成功.昨晚回家清理干净电脑,又小心翼翼地装了一遍,成功,今天来公司又装了一遍,也成功,现把步骤记录如下: (注:本步骤适用于WIN7 64位操作系统,Python版本为3.4.3 64bit) 1. 请将电脑清理干净.包括之前装的Mi

深度学习框架keras平台搭建(关键字:windows、非GPU、离线安装)

当下,人工智能越来越受到人们的关注,而这很大程度上都归功于深度学习的迅猛发展.人工智能和不同产业之间的成功跨界对传统产业产生着深刻的影响. 最近,我也开始不断接触深度学习,之前也看了很多文章介绍,对深度学习的历史发展以及相关理论知识也有大致了解. 但常言道:纸上得来终觉浅,绝知此事要躬行:与其临渊羡鱼,不如退而结网.因此决定自己动手玩一玩. 对比了当下众多流行框架的优缺点,以及结合自身硬件条件,最后选定keras框架作为入手点. 作为大多数人都习惯于Windows系统,此外由于GPU比较昂贵,本

深度学习框架之TensorFlow的概念及安装(ubuntu下基于pip的安装,IDE为Pycharm)

2015年11月9日,Google发布人工智能系统TensorFlow并宣布开源. 1.TensorFlow的概念 TensorFlow 是使用数据流图进行数值计算的开源软件库.也就是说,TensorFlow 使用图(graph)来表示计算任务.图中的节点表示数学运算,边表示运算之间用来交流的多维数组(也就是tensor,张量).TensorFlow 灵活的架构使得你可以将计算过程部署到一个或多个CPU或GPU上. TensorFlow 最初是由 Google Brain Team 的研究人员和

深度学习框架搭建之最新版Python及最新版numpy安装

这两天为了搭载深度学习的Python架构花了不少功夫,但是Theano对Python以及nunpy的版本都有限制,所以只能选用版本较新的python和nunpy以确保不过时.但是最新版Python和最新版numpy有点不完善,很多安装步骤都要在命令行里完成,所以花了我很多时间,为了祭奠我安装numpy逝去的青春,特写此日志,确保以后的青春不再逝去.    先说说python的安装,我是64位windows系统.所以选用的是https://www.python.org/downloads/rele