【theano-windows】学习笔记一——theano中的变量

前言

因为目前需要搭建一些关于RBM或者其他之类的模型,感觉不太会折腾caffe,然而我发现了几个有趣网址,使用theano实现了各种各样的模型,所以,尝试学一下theano。主要以官方教程为主,所以博客会以译文的方式公布,当然会有自己的一些小见解或者扩展,编程环境为win7+jupyter notebook,如若有误,谢谢指正

国际惯例,网址帖一波:

【PTVS+Theano+CPU/GPU】在windows下使用VS安装theano深度学习工具

theano官方文档

theano搭建各种模型,包含RBM,CNN,RNN,AE等

python基础教程
theano中文翻译

基本数据类型定义及操作

因为theano的变量定义模块基本都存在theano.tensor中,所以我们先引入theano及其此模块

import theano
import theano.tensor as T

标量定义和操作

首先定义theano类型的两个标量,有两种方法:

  • 单独为每一个标量定义

    x=T.dscalar('x')
    y=T.dscalar('y')
  • 或者一次性定义多个

    x,y=T.dscalars('x','y')
  • 然后定义两个标量之间的操作,并将它转换为theano可执行的函数

    转换方法是theano.function(),具体如下

    z=x+y
    f=theano.function([x,y],z)

    可以发现function函数接受两个输入参数,第一个代表这个函数执行定义的功能所需要的输入信息,第二个代表这个函数提供的输出。这两个参数都可以是一个值或者一个列表f就相当于pythondef定义的函数。

    执行此函数看看,提供一个列表输入,和一个值输出

    print f(1,2)#3.0
    

    可以发现theanodscalar数据类型是double,只不过用type输出来是float64

  • 另一种不使用function的方法叫eval,但是没function灵活,实现同样的功能方法如下

    print z.eval({x:2,y:3})#5.0
    

    它是将一个字典作为输入变量,然后返回表达式数值结果。第一次使用eval()会很慢,因为后台需要使用function()编译表达式,但是后面相同的变量调用eval()就快了,因为编译好的函数已经缓存了此变量

向量的定义和操作

  • 两种定义方法

    
    #x,y=T.dvectors('x','y')x=T.dvector('x')
    y=T.dvector('y')
  • 赋值,运算

    import numpy as np
    z=x+y
    f=theano.function([x,y],z)
    x1=np.array([1,2,3])
    y1=np.array([4,5,6])
    print f(x1,y1)#[ 5.  7.  9.]
    

矩阵的赋值和运算

  • 两种定义方法

    
    # x=T.dmatrix('x')# y=T.dmatrix('y')x,y=T.dmatrices('x','y')
  • 赋值,运算

    z=x+y
    f=theano.function([x,y],z)
    x2=np.array([[1,2,3],[4,5,6]])
    y2=np.array([[1,4,7],[2,5,8]])
    print f(x2,y2)
    '''
    [[  2.   6.  10.]
    [  6.  10.  14.]]
    '''

其它数据类型和操作

数据类型

上面讲的只有dscalar,’dvector’,’dmatrix’,但是theano还提供了许多其它精度的变量类型

byte: bscalar, bvector, bmatrix, brow, bcol, btensor3, btensor4, btensor5
16-bit integers: wscalar, wvector, wmatrix, wrow, wcol, wtensor3, wtensor4, wtensor5
32-bit integers: iscalar, ivector, imatrix, irow, icol, itensor3, itensor4, itensor5
64-bit integers: lscalar, lvector, lmatrix, lrow, lcol, ltensor3, ltensor4, ltensor5
float: fscalar, fvector, fmatrix, frow, fcol, ftensor3, ftensor4, ftensor5
double: dscalar, dvector, dmatrix, drow, dcol, dtensor3, dtensor4, dtensor5
complex: cscalar, cvector, cmatrix, crow, ccol, ctensor3, ctensor4, ctensor5

其它与numpy兼容的类型可以查询这里:tensor creation

变量操作

上面讲的都是标量、向量、矩阵各自之间的操作,theano还支持标量+矩阵, 向量+矩阵, 标量+向量之类的操作,详细查询: broadcasting

随便拿几个作为实例看看:

  • dot函数,如果输入是二维矩阵,那么就进行二维矩阵的乘法运算。如果输入的是一维向量,就进行向量间的点乘计算(不包含共轭复数),例子:

    import theano
    import theano.tensor as T
    import numpy as np#x,y=T.dvectors('x','y')x=T.dvector('x')
    y=T.dvector('y')
    z1=T.dot(x,y)
    f=theano.function([x,y],z1)
    x1=np.array([1,2,3])
    y1=np.array([4,5,6])
    print f(x1,y1)#32.0
    
    
    #dot的向量乘积#x,y=T.dvectors('x','y')x=T.dmatrix('x')
    y=T.dmatrix('y')
    z1=T.dot(x,y)
    f=theano.function([x,y],z1)
    x2=np.array([[1,2,3],[4,5,6]])
    y2=np.array([[1,4],[2,5],[7,8]])
    print f(x2,y2)
    '''
    [[ 26.  38.]
    [ 56.  89.]]
    '''
  • outer函数,向量外积

    
    #outer 向量外积#x,y=T.dvectors('x','y')x=T.dvector('x')
    y=T.dvector('y')
    z3=T.outer(x,y)
    f=theano.function([x,y],z3)
    x1=np.array([1,2,3])
    y1=np.array([4,5,6])
    print f(x1,y1)
    '''
    [[  4.   5.   6.]
    [  8.  10.  12.]
    [ 12.  15.  18.]]
    '''
  • 向量+矩阵

    x=T.dvector('x')
    y=T.dmatrix('y')
    z4=x+y
    f=theano.function([x,y],z4)
    x1=np.array([1,2,3])
    y1=np.array([[4,5,6],[7,8,9]])
    print f(x1,y1)
    '''
    [[  5.   7.   9.]
    [  8.  10.  12.]]
    '''

官网介绍的剩下几个函数回头要用再慢慢补

练习

计算表达式a ** 2 + b ** 2 + 2 * a * b

标量形式

a,b=T.dscalars('a','b')
c=a ** 2 + b ** 2 + 2 * a * b
f=theano.function([a,b],c)
print f(2,3)

向量形式

a,b=T.dvectors('a','b')
c=a ** 2 + b ** 2 + 2 * a * b
f=theano.function([a,b],c)
print f([1,2],[4,5])
#[ 25.  49.]

所有code:链接: https://pan.baidu.com/s/1i4K5ULJ 密码: 5i69

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/246645.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【theano-windows】学习笔记二——theano中的函数和共享参数

前言 上一篇博客中学到了theano中的变量类型,也就是dscalar、dvector之类的, 然后还有一个theano.function和eval函数, 将我们所定义的操作转换成theano可执行的函数,类似于def, 还有就是简单的线性代数运算操作。 在神经网络(NN)中, 我们声明了权重、…

【theano-windows】学习笔记三——theano中的导数

前言 就一个NN而言,包含梯度、偏置、参数更新,而前面第一篇博客学习了theano中符号变量的定义, 第二篇博客学习了变量的随机初始化, 变量之间的互相操作(类似于sigmoid(w∗xb)), 但是参数更新还应涉及到损失函数的偏导计算,这一章节就是看看…

【theano-windows】学习笔记四——theano中的条件语句

前言 按照官网教程,学习条件语句Switch和ifelse的使用 参考地址: conditions 性能对比 ifElse是将布尔变量和两个变量当做输入 Switch是将张量和两个变量当做输入. 因为Switch是元素级操作,所以比ifElse更具一般性 Switch需要对所有输出变量进行评…

【theano-windows】学习笔记五——theano中张量部分函数

前言 至此感觉应该可以写出一个logistic回归程序了,但是为了达到对theano中张量的更灵活的使用, 还是先看一下thenao.tensor对变量都提供了哪些操作,最全的文档戳这里或者这里, 这里就稍微摘取一点自我感觉以后可能用得多的函数 基本张量函数 创建张量…

【theano-windows】学习笔记六——theano中的循环函数scan

前言 Scan是Theano中最基础的循环函数, 官方教程主要是通过大量的例子来说明用法. 不过在学习的时候我比较习惯先看看用途, 然后是参数说明, 最后再是研究实例. 国际惯例, 参考网址 官网关于Scan的11个例子 官网更全面的介绍 简介 用途 递归的一般形式, 可以被用于循环s…

多标签分类、多任务分类、多输出回归概念

前言 虽然不是搞分类的,但是还是看看多标签和多分类的区别。为了避免自己的错误理解, 当然是选择原谅他啊…….找正规文档看哇. 以下翻译分别来自scikit-learn.org和 维基 喂鸡百科 国际惯例,贴上来源: Multiclass and multilabel algorithms Multi-…

【theano-windows】学习笔记七——logistic回归

前言 前面只是学了最基本的theano操作,但是theano中还有很多其他的东西,比如图结构,自定义函数等,这些暂时没有用到就先不看了,后续学啥用啥,没必要一口气吃个胖子,免得消化不良还把前面吃的东…

【theano-windows】学习笔记八——预备知识

前言 按照上一个博客所说的,直接按照深度学习0.1文档进行学习,当然在此之前我们需要了解这一系列教程所需要的数据集,以及一些概念性的东西 国际惯例,参考博客网址: 深度学习0.1文档 深度学习0.1文档-中文翻译 基…

【theano-windows】学习笔记九——softmax手写数字分类

前言 上一篇博客折腾了数据集的预备知识, 接下来按照官方的Deep learning 0.1 documentation一步步走, 先折腾softmax, 关于softmax和logistic回归分类的联系, 我在之前写过一个小博客 国际惯例, 参考博客走一波: Classifying MNIST digits using Logistic Regression soft…

【theano-windows】学习笔记十——多层感知机手写数字分类

前言 上一篇学习了softmax, 然后更进一步就是学习一下基本的多层感知机(MLP)了. 其实多层感知机同时就是w*xb用某个激活函数激活一下, 得到的结果作为下一层神经元的输入x, 类似于 output⋯f3(f2(f1(x∗w1b2)∗w2b2)∗w3b3)⋯output=\cdots f^3(f^2(f^1(x*w^1+b^2)*w^2+b^2)*…

【theano-windows】学习笔记十一——theano中与神经网络相关函数

前言 经过softmax和MLP的学习, 我们发现thenao.tensor中除了之前的博客【theano-windows】学习笔记五——theano中张量部分函数提到的张量的定义和基本运算外, 还有一个方法称为nnet, 如果自己实现过前面两篇博客中的代码就会发现用到了theano.tensor.nnet.sigmoid和thenao.te…

【caffe-windows】全卷积网络特征图分析

前言 突然就想分析一下全卷积网络的转置卷积部分了, 就是这么猝不及防的想法, 而且这个网络对图片的输入大小无要求,这么神奇的网络是时候分析一波了,我个人的学习方法调试代码,然后对照论文看理论 本次分析主要针对每层的权重大小和特征图…

【theano-windows】学习笔记十二——卷积神经网络

前言 按照进度, 学习theano中的卷积操作 国际惯例, 来一波参考网址 Convolutional Neural Networks (LeNet) 卷积神经网络如何应用在彩色图像上? 卷积小知识 三大特性:局部感知(稀疏连接), 权值共享, 池化 上图很重要, 描述的是前一个隐层m-1具有四…

【theano-windows】学习笔记十三——去噪自编码器

前言 上一章节学习了卷积的写法,主要注意的是其实现在theano.tensor.nnet和theano.sandbox.cuda.dnn中都有对应函数实现, 这一节就进入到无监督或者称为半监督的网络构建中. 首先是自编码器(Autoencoders)和降噪自编码器(denoising Autoencoders) 国际惯例, 参考网址: Denoi…

梯度优化算法Adam

前言 最近读一个代码发现用了一个梯度更新方法, 刚开始还以为是什么奇奇怪怪的梯度下降法, 最后分析一下是用一阶梯度及其二次幂做的梯度更新。网上搜了一下, 果然就是称为Adam的梯度更新算法, 全称是:自适应矩估计(adaptive moment estimation) 国际惯例, 参考博文: 一文看…

读写bin

前言 工程中经常将参数文件存储为bin格式, 但是实际中为了分析其参数, 也不好用C去读取调试它, 所以可以用matlab或者python去读取它, 但是还是蛮坑的 Matlab中的读取和写入 写入文件 比较坑的是, 一定要注意自己的文件存储的类型, 比如数值是float还是double之类的, 不然很…

【theano-windows】学习笔记十四——堆叠去噪自编码器

前言 前面已经学习了softmax,多层感知器,CNN,AE,dAE,接下来可以仿照多层感知器的方法去堆叠自编码器 国际惯例,参考文献: Stacked Denoising Autoencoders (SdA) Greedy Layer-Wise Training of Deep Networks 理…

【theano-windows】学习笔记十五——受限玻尔兹曼机

前言 终于到了最喜欢的模型: 受限玻尔兹曼机(RBM)了, 发现关于RBM是如何从能量模型发展过来的介绍非常不错, 而关于详细理论证明, 可以去看我前面的受限玻尔兹曼机的一系列博客. 国际惯例, 参考博客,超级强推第二个博客, 证明过程很给力: Restricted Boltzmann Machines (R…

【Ogre-windows】环境配置

前言 由于工程原因, 学习一下Ogre面向对象图形渲染开源引擎, 慢慢爬坑吧。首先还是环境的配置问题哎. 其实最重要的是要预先编译三方库, 虽然官方说可以自动编译, 但是在自己电脑上还是出现了无法解析外部符号之类的问题, 正常情况下我就认为是三方库的lib出现了问题, 最后额外…

【theano-windows】学习笔记十六——深度信念网络DBN

前言 前面学习了受限玻尔兹曼机(RBM)的理论和搭建方法, 如果稍微了解过的人, 肯定知道利用RBM可以堆叠构成深度信念网络(deep belief network, DBN)和深度玻尔兹曼机(deep Boltzmann machine), 这里就先学习一下DBN. 国际惯例, 参考博文: Deep Belief Networks A fast lear…