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

前言

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

基本张量函数

创建张量

以下三条语句都是创建一个张量实例, 代表一个0维的整型阵列, 名字是myvar

x=T.scalar('myvar',dtype='int32')
x=T.iscalar('myvar')
x=T.TensorType(dtype='int32',broadcastable=())('myvar')
print x.type
#TensorType(int32, scalar)

还有其它可选的创建方法, 比如下面分别创建从0维到5维浮点型张量

x=T.scalar('myvar',dtype=theano.config.floatX)#创建0维阵列
x=T.vector('myvar',dtype=theano.config.floatX)#创建以为阵列
x=T.row('myvar',dtype=theano.config.floatX)#创建二维阵列,行数为1
x=T.col('myvar',dtype=theano.config.floatX)#创建二维阵列,列数为1
x=T.matrix('myvar',dtype=theano.config.floatX)#创建二维矩阵
x=T.tensor3('myvar',dtype=theano.config.floatX)#创建三维张量
x=T.tensor4('myvar',dtype=theano.config.floatX)#创建四维张量
x=T.tensor5('myvar',dtype=theano.config.floatX)#创建五维张量
x.ndim#输出维度看看
#5

一次性创建多个张量方法

'''
标量: iscalars, lscalars, fscalars, dscalars
向量: ivectors, lvectors, fvectors, dvectors
行向量: irows, lrows, frows, drows
列向量:icols, lcols, fcols, dcols
矩阵: imatrices, lmatrices, fmatrices, dmatrices
'''
x,y,z=T.dmatrices(3)#没有名字的三个矩阵
x,y,z=T.dmatrices('x','y','z')#有名字的三个矩阵

自己定义一个更高维的阵列, 比如创建一个6维阵列

dtensor6=T.TensorType('float64',(False,)*6)#自定义6维阵列

这里写图片描述

重组

  • 获取张量的shape

    theano.tensor.shape(x)

    【PS】很奇怪为什么用这句话去获取上面创建的0-6维阵列, 大小都是0, 难道是因为只声明没赋值?回头赋值看看. 但是用x.ndim能够得到张量的维度

  • 将一个张量x按照要求重组成指定大小的张量, 比如1*9的变成3*3

    theano.tensor.reshape(x, newshape, ndim=None)

    x是要被重新reshape的张量
    newshapexreshape以后的大小

    ndim是指定新的shape的长度, 如果是None, 此函数会自动推导其值

  • 同样是重组张量大小, 将(2,3,4,5)大小的四维向量重组为(2,60)大小, 就是用

    theano.tensor.flatten(x, outdim=2)

    outdim就是输出的向量的引导维度的大小

  • 循环移位函数

    theano.tensor.roll(x, shift, axis=None)

    将输入张量x的第axis的维度循环移动shift维, 跟numpy.roll一样的效果

  • 张量左右或者指定维度填充padding

    theano.tensor.shape_padleft(x, n_ones=1)#左边padding n_ones个1
    theano.tensor.shape_padright(x, n_ones=1)#右边padding n_ones个1
    theano.tensor.shape_padaxis(t, axis)#在axis插入一个维度
    tensor = theano.tensor.tensor3()
    theano.tensor.shape_padaxis(tensor, axis=0)#InplaceDimShuffle{x,0,1,2}.0theano.tensor.shape_padaxis(tensor, axis=1)#InplaceDimShuffle{0,x,1,2}.0
    

填充张量

可以用某个值(0,1或者其它值)填充指定大小的张量

theano.tensor.zeros_like(x, dtype=None)#填充一个与x相同大小的全1矩阵, 默认类型是x.dtype
theano.tensor.ones_like(x)#填充一个与x相同大小的全1矩阵, 默认类型是x.dtype
theano.tensor.zeros(shape,dtype=None)#填充一个大小为shape的全0矩阵, 默认类型floaX
theano.tensor.ones(shape, dtype=None)##填充一个大小为shape的全1矩阵, 默认类型floaX
theano.tensor.fill(a, b)#用标量b填充与a同样大小的矩阵
theano.tensor.alloc(value, *shape)#用value填充一个shape大小的张量
theano.tensor.eye(n, m=None, k=0, dtype=theano.config.floatX)#输出的行数n和列数m,主对角线是0,正数是朝上移动,负数是朝下移动的对角线,创建的是一个除了第k个对角线上值为1以外的全0矩阵
theano.tensor.identity_like(x)#与x大小相同的矩阵,但是主对角线值为1,其它元素值为0
theano.tensor.stack(tensors, axis=0)#按照`axis`轴去堆叠多个张量

theano中给出了最后一个用于堆叠张量的函数的使用方法

#堆叠张量
a,b,c=T.scalars(3)
a.ndim#如果是标量,维度就是0
x=T.stack([a,b,c])
x.ndim#堆叠成一个向量, 所以维度是1a,b,c=T.tensor4s(3)
x=T.stack([a,b,c])
x.ndim
#5

内部操作(最大最小值,方差,均值之类的)

theano.tensor.max(x, axis=None, keepdims=False)#返回axis轴上的最大值
theano.tensor.argmax(x, axis=None, keepdims=False)#返回axis轴上最大值的索引
theano.tensor.max_and_argmax(x, axis=None, keepdims=False)#返回axis轴上最大值及其索引
theano.tensor.min(x, axis=None, keepdims=False)#返回axis轴上最小值
theano.tensor.argmin(x, axis=None, keepdims=False)#返回axis轴上最小值的索引
theano.tensor.sum(x, axis=None, dtype=None, keepdims=False, acc_dtype=None)#按照axis轴加和
theano.tensor.prod(x, axis=None, dtype=None, keepdims=False, acc_dtype=None, no_zeros_in_input=False)#沿着axis轴元素乘积
theano.tensor.mean(x, axis=None, dtype=None, keepdims=False, acc_dtype=None)#axis轴的均值
theano.tensor.var(x, axis=None, keepdims=False)#axis轴的方差
theano.tensor.std(x, axis=None, keepdims=False)#axis轴的标准差

索引

  • 比如找矩阵中大于某个数的所有数值, 需要注意的是, theano并没有提供布尔类型, 所以需要这样找

    t=T.arange(9).reshape((3,3))#不要使用t[t > 4].eval()t[(t>4).nonzero()].eval()#array([5, 6, 7, 8], dtype=int64)
    
  • 重置张量某部分值, 比如用5取代索引[10:]处也就是10及其以后所有索引的值

    r = T.ivector()
    new_r = T.set_subtensor(r[10:], 5)
  • 将张量某部分值加上一个值, 比如实现r[10:] += 5

    
    #theano.tensor.inc_subtensor(x, y, inplace=False, set_instead_of_inc=False, tolerate_inplace_aliasing=False)r = T.ivector()
    new_r = T.inc_subtensor(r[10:], 5)

转换类型、复数操作

#theano.tensor.cast(x, dtype)#把x转换成一个具有相同大小的不同数据类型的张量
import theano.tensor as T
x = T.matrix()
x_as_int = T.cast(x, 'int32')
#注意如果x是复数会报错
theano.tensor.real(x)#返回复数的实数域部分
theano.tensor.imag(x)#返回复数的复数域部分

比较大小

theano.tensor.lt(a, b)#a < b大于
theano.tensor.gt(a, b)#a > b小于
theano.tensor.le(a, b)#a <= b小于等于
theano.tensor.ge(a, b)#a >= b大于等于
theano.tensor.eq(a, b)#a==b是否相等
theano.tensor.neq(a, b)#a!=b是否不相等
theano.tensor.isnan(a)#numpy.isnan是否为非数1/0之类的
theano.tensor.isinf(a)#numpy.isinf是否为无穷

条件

theano.tensor.switch(cond, ift, iff)#Switch
theano.tensor.where(cond, ift, iff)#Switch的别名
theano.tensor.clip(x, min, max)#如果x<min就取min, 大于max就取max

数学操作(较为常用)

theano.tensor.abs_(a)#取绝对值
theano.tensor.angle(a)#complex-valued张量的角度分量
theano.tensor.exp(a)#指数运算
theano.tensor.maximum(a, b)#返回a和b较大的一个
theano.tensor.minimum(a, b)#返回a和b较小的一个
theano.tensor.neg(a)#返回-a
theano.tensor.inv(a)#返回导数, 也就是1.0/a
theano.tensor.log(a), log2(a), log10(a)#返回以e,2,10为底的对数值
theano.tensor.sgn(a)#返回a的符号
theano.tensor.ceil(a)#向上取整
theano.tensor.floor(a)#向下取整
theano.tensor.round(a, mode="half_away_from_zero")#四舍五入
theano.tensor.iround(a, mode="half_away_from_zero")#cast(round(a, mode),’int64’)的简写
theano.tensor.sqr(a)#平方
theano.tensor.sqrt(a)#开根号
theano.tensor.cos(a), sin(a), tan(a)#返回a的三角函数值
theano.tensor.cosh(a), sinh(a), tanh(a)#返回a的反三角函数值

线性代数

theano.tensor.dot(X, Y)#矩阵乘法,或者是向量内积
theano.tensor.outer(X, Y)#向量外积
theano.tensor.tensordot(a, b, axes=2)#比如(2,3,4)和(5,6,4,3)的张量乘积,得到的是(2,5,6)大小的张量,这三个维度就是没有被加和起来的维度,具体实现可以看官方文档

梯度

theano.gradient.grad(cost, wrt, consider_constant=None, disconnected_inputs='raise', add_names=True, known_grads=None, return_disconnected='zero', null_gradients='raise')

暂时只要知道cost就是损失函数表达式, param可以是一个数组或者矩阵, 就是被求导的变量

costwrt

可以参考前面的一篇博客: 【theano-windows】学习笔记三——theano中的导数

【PS】遗憾的时候目前只知道用途,并不知道具体到实际操作中的用法,不过嘛,只有先知道有这个东东才能继续探索怎么用嘛。接下来继续上一篇博客【theano-windows】学习笔记四——theano中的条件语句的后续学习, 按照官方教程, 应该是学习循环函数scan的使用了

本博文的代码:链接: https://pan.baidu.com/s/1hstJVEk 密码: eqhj

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

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

相关文章

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

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

【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】全卷积网络特征图分析

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

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

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

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

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

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

前言 前面已经学习了softmax,多层感知器,CNN&#xff0c;AE&#xff0c;dAE&#xff0c;接下来可以仿照多层感知器的方法去堆叠自编码器 国际惯例&#xff0c;参考文献&#xff1a; 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…

【Ogre-windows】实例配置

前言 折腾了好久才搞定教程实例, 主要是因为上一篇博客安装的具体版本是Ogre1.10.9, 而官方的Ogre Wiki Tutorial Framework没有指定具体版本, 如果单纯下载Ogre Wiki Tutorial Framework 1.10 - (Windows line endings, updated 2015-10-15) 运行, 基本会血崩. 所以, 在经过仔…

【Ogre-windows】旋转矩阵及位置解析

前言 这篇博客主要针对三种问题 如何创建动画帧如何获取全局位置如何计算全局旋转矩阵 仿真环境为VS2013Ogre1.10.9与matlab验证 创建动画帧 这里只做一个简单的实验: 将自带的人物模型Jaiqua的run运动给新创建的运动myrun中并播放&#xff0c;直接贴代码了 void JaiQua:…

BP推导——续

前言 之前有证明过一次人工神经网络——【BP】反向传播算法证明 &#xff0c;但是回头看的时候&#xff0c;有很多地方非常不严谨&#xff0c;特此拿出来再单独证明一次BP&#xff0c;并严格保证其严谨性。如果想看看粗略的证明&#xff0c;可以去看我之前的博客&#xff0c;毕…

matlab学习——强连通分量

前言 最近motion graph相关实验&#xff0c;发现实现运动过渡需要构建运动图&#xff0c;而为了避免运动过渡陷入死胡同&#xff0c;需要对图结构进行裁剪&#xff0c;方法就是计算图模型的极大强联通分量&#xff0c;但是自己懒得去实现&#xff0c;所以就去搜了一下matlab中…

【音频处理】离散傅里叶变换

前言 最近复现音乐驱动舞蹈的文章《Dancing-to-Music Character Animation》&#xff0c;用到了与傅里叶变换很相似的称为常Q变换的方法去分割音乐&#xff0c;所以对傅里叶变换做了一个小了解&#xff0c;本文不深入各种乱糟糟的理论&#xff0c;比如什么蝶形算法啥的&#x…

【音频处理】短时傅里叶变换

前言 上一篇博客讲了离散傅里叶变换&#xff0c;里面的实例是对整个信号进行计算&#xff0c;虽然理论上有N点傅里叶变换(本博客就不区分FFT和DFT了&#xff0c;因为它俩就是一个东东&#xff0c;只不过复杂度不同)&#xff0c;但是我个人理解是这个N点是信号前面连续的N个数值…

【theano-windows】学习笔记十九——循环神经网络

前言 前面已经介绍了RBM和CNN了&#xff0c;就剩最后一个RNN了&#xff0c;抽了一天时间简单看了一下原理&#xff0c;但是没细推RNN的参数更新算法BPTT&#xff0c;全名是Backpropagation Through Time。 【注】严谨来说RNN有两个称呼&#xff1a;①结构上递归的recursive n…

【theano-windows】学习笔记二十——LSTM理论及实现

前言 上一篇学习了RNN&#xff0c;也知道了在沿着时间线对上下文权重求梯度的时候&#xff0c;可能会导致梯度消失或者梯度爆炸&#xff0c;然后我们就得学习一波比较常见的优化方法之LSTM 国际惯例&#xff0c;参考网址&#xff1a; LSTM Networks for Sentiment Analysis …

刚体运动学——欧拉角、四元数、旋转矩阵

前言 刚体运动旋转一般用&#xff1a;欧拉角、四元数、轴角对等表示&#xff0c;在对某个坐标旋转的时候&#xff0c;只需将欧拉角或四元数转换为旋转矩阵&#xff0c;并与原始坐标相乘&#xff0c;便可得到旋转以后的坐标。这里主要看看欧拉角、四元数和旋转矩阵。 国际惯例…