【问题标题】:torch/nn - Joining arrays of Tensors element wisetorch/nn - 明智地连接张量元素的数组
【发布时间】:2016-10-11 09:30:39
【问题描述】:

这个问题的主题是将神经网络的张量与 Lua 的 torch/nn 和 torch/nngraph 库结合起来。几周前我开始使用 Lua 编码,所以我的经验非常少。在下文中,我将 lua 表称为数组。

上下文

我正在使用循环神经网络进行语音识别。 在网络中的某个点,有Nm 张量数组。

a = {a1, a2, ..., aM},
b = {b1, b2, ..., bM}, 
... N times

其中aibi 是张量,{} 代表一个数组。

需要做的是按元素连接所有这些数组,以便outputM 张量的数组,其中output[i] 是第二次连接来自N 数组的每个第 i 个张量的结果维度。

output = {z1, z2, ..., zM}

示例

||用来表示张量

x = {|1 1|, |2 2|}
     |1 1|  |2 2|
     Tensors of size 2x2

y = {|3 3 3|, |4 4 4|}
     |3 3 3|  |4 4 4|
     Tensors of size 2x3
        |
        | Join{x,y}
        \/
z = {|1 1 3 3 3|, |2 2 4 4 4|}
     |1 1 3 3 3|  |2 2 4 4 4|
     Tensors of size 2x5

所以x 的第一个张量大小为 2x2 与y 的第一个张量大小为 2x3 在第二个维度上连接,并且每个数组的第二个张量相同,导致z 一个张量数组 2x5 .

问题

现在这是一个基本的串联,但我似乎无法在 torch/nn 库中找到允许我这样做的模块。我当然可以编写自己的模块,但如果已经存在的模块可以这样做,那么我宁愿使用它。

我知道连接表的唯一现有模块是(显然)JoinTable。它需要一组张量并将它们连接在一起。我想按元素加入张量数组。

此外,当我们向网络提供输入时,N 数组中的张量数量会发生变化,因此上述上下文中的 m 不是恒定的。

想法

为了使用 JoinTable 模块,我认为我可以做的是将我的数组转换为张量,然后将JoinTable 转换为转换后的N 张量。但话又说回来,我需要一个模块来进行这种转换,并且需要另一个模块来转换回数组,以便将其提供给网络的下一层。

不得已

编写一个新模块,迭代所有给定的数组并按元素连接。当然它是可行的,但这篇文章的全部目的是找到一种方法来避免编写有味道的模块。我觉得奇怪的是这样的模块还不存在。


结论

我终于决定按照我在不得已中所写的去做。我编写了一个新模块,它遍历所有给定的数组并按元素连接。

不过,@fmguler 给出的答案也是如此,无需编写新模块。

【问题讨论】:

    标签: lua jointable torch


    【解决方案1】:

    你可以像这样用 nn.SelectTable 和 nn.JoinTable 来做;

    require 'nn'
    
    x = {torch.Tensor{{1,1},{1,1}}, torch.Tensor{{2,2},{2,2}}}
    y = {torch.Tensor{{3,3,3},{3,3,3}}, torch.Tensor{{4,4,4},{4,4,4}}}
    
    res = {}
    res[1] = nn.JoinTable(2):forward({nn.SelectTable(1):forward(x),nn.SelectTable(1):forward(y)})
    res[2] = nn.JoinTable(2):forward({nn.SelectTable(2):forward(x),nn.SelectTable(2):forward(y)})
    
    print(res[1])
    print(res[2])
    

    如果您希望在模块中完成此操作,请将其包装在 nnGraph 中;

    require 'nngraph'
    
    x = {torch.Tensor{{1,1},{1,1}}, torch.Tensor{{2,2},{2,2}}}
    y = {torch.Tensor{{3,3,3},{3,3,3}}, torch.Tensor{{4,4,4},{4,4,4}}}
    
    xi = nn.Identity()()
    yi = nn.Identity()()
    res = {}
    --you can loop over columns here>>
    res[1] = nn.JoinTable(2)({nn.SelectTable(1)(xi),nn.SelectTable(1)(yi)})
    res[2] = nn.JoinTable(2)({nn.SelectTable(2)(xi),nn.SelectTable(2)(yi)})
    module = nn.gModule({xi,yi},res)
    
    --test like this
    result = module:forward({x,y})
    print(result)
    print(result[1])
    print(result[2])
    
    --gives the result
    th> print(result)
    {
      1 : DoubleTensor - size: 2x5
      2 : DoubleTensor - size: 2x5
    }
    
    th> print(result[1])
     1  1  3  3  3
     1  1  3  3  3
    [torch.DoubleTensor of size 2x5]
    
    th> print(result[2])
     2  2  4  4  4
     2  2  4  4  4
    [torch.DoubleTensor of size 2x5]
    

    【讨论】:

    • 太棒了,没想到。
    • 只需要添加某种循环来获得可变数量的数组,例如 x 和 y 以及数组中可变数量的张量。尽管对于一个简单的任务来说它变得有点复杂。我选择这个作为接受的答案,因为它满足了我不编写新模块的需要(我最终结束了)。
    猜你喜欢
    • 2021-08-23
    • 2016-10-26
    • 2017-04-16
    • 2018-05-13
    • 2017-09-22
    • 2023-03-25
    • 2016-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多