Theano dimshuffle函数用法

来源:互联网 发布:网络包年维护服务 编辑:程序博客网 时间:2024/06/01 17:13

本文主要介绍Theano中的一个函数,名叫dimshuffle()。在做卷积实验室会用到,是用来改变一个array张量结构的一个工具。原来不懂这个函数的作用以及作用后的结果是什么,经过多次实验,终于有了结果。下面来说一下我的结果。仅贡献给尚不懂这个函数的同学。 
   
  为了弄懂dimshuffle()函数的作用,最好的方法就是做实验。输入数据,然后观察输出数据。渐渐地就能找到规律,并能总结出函数作用。下面我们开始做实验。

  实验代码gitHub下载。 
  实验代码CSDN免费下载。

  代码介绍:借用Python卷积运算的代码,将图片显示的部分去掉,另外加入function函数中间值输出功能。

  实验条件:经测试,b是shared变量时,才能调用dimshuffle()函数。 
  实验开始: 
  1. 一维变换。b是一维张量(把b视为列向量,因此其shape为(2,)),调用dimshuffle()时,传入的参数只可以为0或’x’
  (1). 调用b.dimshuffle(0) 
    结果:b_1.dimshuffle str = [ 0.33799502 -0.06810025] 
    分析:输出b的原始结构信息,shape为(2,)。 
     
  (2). 调用b.dimshuffle(0, ‘x’) 
    结果:b_1.dimshuffle str = [[ 0.33799502] 
                   [-0.06810025]] 
    分析:将b的结构改变为2维,且shape为(2, 1) 
   
  (3). 调用b.dimshuffle(‘x’, 0) 
    结果:b_1.dimshuffle str = [[ 0.33799502 -0.06810025]] 
    分析:将b的结构改变为2维,且shape为(1, 2) 
   
  (4). 调用b.dimshuffle(0, ‘x’, ‘x’) 
    结果:b_1.dimshuffle str = [[[ 0.33799502]] 
[[-0.06810025]]] 
    分析:将b的结构改变为3维,且shape为(2, 1, 1) 
     
  (5). 调用b.dimshuffle(‘x’, 0, ‘x’) 
    结果:b_1.dimshuffle str = [[[ 0.33799502] 
                  [-0.06810025]]] 
    分析:将b的结构改变为3维,且shape为(1, 2, 1) 
     
  (6). 调用b.dimshuffle(‘x’, ‘x’, 0) 
    结果:b_1.dimshuffle str = [[[ 0.33799502 -0.06810025]]] 
    分析:将b的结构改变为3维,且shape为(1, 1, 2) 
     
  其他实验自己继续做,比如dimshuffle(0,’x’,’x’,’x’)等。先作如下总结:0代表原始b的行。因为原b是1维,因此dimshuffle中的参数只有0,没有1。每增加一个’x’,则结果增加一维。0的位置不同,结果中结构不同。结果结构规律为:把’x’用1替换,0则用原来的行数代替。例如(4)中的(0, ‘x’, ‘x’)用以上规律则其结构为:2*1*1,为什么0对应的是2呢,因为原来的b有2行。

  2. 二维变换。b1是二维张量,调用dimshuffle()时,传入的参数可以为(0和1)或’x’ 
  (1). 调用b.dimshuffle(0, 1) 
    结果:b_1.dimshuffle str = [[0 1 2]] 
    分析:输出b1的原始结构信息,shape为(1,3)。 
     
  (2). 调用b.dimshuffle(1, 0) 
    结果:b_1.dimshuffle str = [[0] 
                 [1] 
                 [2]] 
    分析:输出b1的原始结构信息,shape为(3,1)。 
     
  (3). 调用b.dimshuffle(0, 1, ‘x’) 
    结果:b_1.dimshuffle str = [[[0] 
                  [1] 
                  [2]]] 
    分析:输出b1的原始结构信息,shape为(1,3,1)。 
     
  (4). 调用b.dimshuffle(0, ‘x’, 1) 
    结果:b_1.dimshuffle str = [[[0 1 2]]] 
    分析:输出b1的原始结构信息,shape为(1,1,3)。 
     
  (5). 调用b.dimshuffle(‘x’, 0, 1) 
    结果:b_1.dimshuffle str = [[[0 1 2]]] 
    分析:输出b1的原始结构信息,shape为(1,1,3)。 
     
  (6). 调用b.dimshuffle(1, 0, ‘x’) 
    结果:b_1.dimshuffle str = [[[0]] 
                 [[1]] 
                 [[2]]] 
    分析:输出b1的原始结构信息,shape为(3,1,1)。 
     
  (7). 调用b.dimshuffle(1, ‘x’, 0) 
    结果:b_1.dimshuffle str =[[[0]] 
                 [[1]] 
                 [[2]]] 
    分析:输出b1的原始结构信息,shape为(3,1,1)。 
     
  (8). 调用b.dimshuffle(‘x’, 1, 0) 
    结果:b_1.dimshuffle str =[[[0] 
                 [1] 
                 [2]]] 
    分析:输出b1的原始结构信息,shape为(1,3,1)。 
     
  (9). 调用b.dimshuffle(‘x’, 1, ‘x’, 0) 
    结果:b_1.dimshuffle str = [[[[0]] 
                  [[1]] 
                  [[2]]]] 
    分析:输出b1的原始结构信息,shape为(1,3,1,1)。 
     
  (10). 调用b.dimshuffle(‘x’, 0, ‘x’, 1) 
    结果:b_1.dimshuffle str = [[[[0 1 2]]]] 
    分析:输出b1的原始结构信息,shape为(1,1,1,3)。 
   
  其他实验自己继续做,比如dimshuffle(0,’x’,’x’,1,’x’)等。先作如下总结:0对应原始b1的行数,1对应原始b1的列数。每增加一个’x’,则结果增加一维。0和1的位置不同,结果中结构不同。结果结构规律为:把’x’用1替换,0用原来b1的行数代替,1用原来b1的列数代替。例如(9)中的(‘x’, 1, ‘x’, 0)用以上规律则其结构为:1*3*1*1。

  基本实验及结果介绍到此,其中描述会有不严谨的部分,但是总结的规律可以让新手明白dimshuffle到底是怎么回事。如有疑问或建议,欢迎交流

原创粉丝点击