Neural style之torch学习笔记1:Tensor

来源:互联网 发布:淘宝花呗额度怎么提升 编辑:程序博客网 时间:2024/06/05 02:12

reference:
http://blog.csdn.net/Hungryof/article/details/51802829(strong recommand)

主要讲Tensor的用法及其一些函数。 
**先说一嘴:**torch中一般有这个东西,就是 
y = torch.func(x,…)等价于y = x:func(…),就是说如果用”torch”,那么“src”是第一个参数。否则就”src:”

初始化

Tensor/rand/zeros/fill

z = torch.Tensor(3,4,2,3,5)  --可以创建多维数组。里面是随机的数。s = torch.Tensor(2,3):fill(1) --用1填充t = torch.rand(3,3)m = torch.zeros(3,3)

其他的初始化方法
<span style="font-size:14px;">t = torch.rand(4,4):mul(3):floor():int()t = torch.Tensor(3,4):zero()  --注意这里Tensor的每个元素赋值为0的zero没有s</span>

Tensor的内容以及信息

  1. Dimension/size/nElement
    z = torch.Tensor(3,4)x = z:nDimension()  -- 2y = z:size()  -- y的值为size2的一维数组。3和4t = z:nElement() -- 12
  2. 用’[ ]’来取数。而不是像matlab的用’( )’。

Tensor的存储方式

数组的第一个数存储位置为storageOffset(), 从1开始。

x = torch.Tensor(7,7,7)x[3][4][5]等价于x:storage()[x:storageOffset()+(3-1)*x:stride(1)+(4-1)*x:stride(2)+(5-1)*x:stride(3)]-- stride(1),stride(2)和stride(3)分别是49,7,1

Tensor的复制
x = torch.Tensor(4):fill(1)y = torch.Tensor(2,2):copy(x) --也可以实现不同Tensor的复制。

Tensor的提取

select/narrow/sub

总说:select是直接提取某一维;narrow是取出某一维并进行裁剪; sub就是取出一块,是对取出的所有维进行裁剪。 
语法: select(dim, index); narrow(dim, index, num); sub(dim1s, dim1e, dim2s, dim2e,…)

x = torch.Tensor(3,4)i = 0 x:apply(function()i = i+1 return i end)--[[x 为  1   2   3   4  5   6   7   8  9  10  11  12]]selected = x:select(1,2)  --第一维的第二个。就是第二行。相当于x[2]narrowed = x:narrow(2,1,2)--[[th> narrowed  1   2  5   6  9  10]]subbed = x:sub(1,3,2,3)--[[ 一维到3为止,二维也到3为止。th> subbed  2   3  6   7 10  11]]

用”{ }”来提取

上面的用函数的方式可能还是有点儿麻烦。matlab有类似(:, : ,1:2)的写法。那么lua呢? 
语法: 
1. [ {dim1 , dim2, …} ]来获取某些维度。类似select 
2. [ { {dim1s, dim1e}, {dim2s, dim2e},… } ] 来进行类似narrow或是sub的裁剪。

x = torch.Tensor(5,6):zero()x[{1,3}] = 1 --等价于matlab的 x(1,3) = 1x[ {2, {2,4}} ] = 2 --等价于matlab的 x(2,2:4) = 2x[ { {}, 4}] = -1 --等价于matlab的 x(:,4) = -1

Expand/RepeatTensor/Squeeze

  1. expand
    x = torch.rand(10,2,1)y = x:expand(10,2,3) --将三维的size变成了3-- expand即为“扩展”,扩展某个size为1的那一维度
<ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>
  1. repeatTensor:将Tensor看成一个元素,按照特定方式进行排列。
    x = torch.rand(5)y = x:repeatTensor(3,2) --size变成了3x10
  1. squeeze :将size为1的维度压缩掉。

View/transpose/permute

  1. view:将Tensor看成特定空间维数.

    x = torch.zeros(2,2,3)x:view(3,4) --等价于x:view(3, -1)--  -1 表示将剩余元素全部看成这一维度


  2. transpose:是permute的精简版本。transpose(dim1, dim2)只能将两个维度进行互换
    <span style="font-family:microsoft yahei;">x = torch.Tensor(3,4):zero()y1 = x:t() --如果是2D数据等价于transpose(1,2)y2 = x:transpose(1,2)</span>

  3. permute
    <span style="font-family:microsoft yahei;"></span><pre code_snippet_id="1839761" snippet_file_name="blog_20160819_18_4999086" name="code" class="html"><span style="font-family: Arial, Helvetica, sans-serif;">x = torch.Tensor(3,4,2,5)</span>
    y = x:permute(2,3,1,4) -- 按照2,3,1,4维进行重排列。


0 0
原创粉丝点击