For loop 在torch7中初始化张量的快速方法

For loop 在torch7中初始化张量的快速方法,for-loop,matrix,lua,deep-learning,torch,For Loop,Matrix,Lua,Deep Learning,Torch,我需要在torch7中用一个索引相关函数初始化一个3D张量,即 func = function(i,j,k) --i, j is the index of an element in the tensor return i*j*k --do operations within func which're dependent of i, j end 然后我初始化一个3D张量a,如下所示: for i=1,A:size(1) do for j=1,A:size(2)

我需要在torch7中用一个索引相关函数初始化一个3D张量,即

func = function(i,j,k)  --i, j is the index of an element in the tensor
    return i*j*k        --do operations within func which're dependent of i, j
end
然后我初始化一个3D张量a,如下所示:

for i=1,A:size(1) do
    for j=1,A:size(2) do
        for k=1,A:size(3) do
            A[{i,j,k}] = func(i,j,k)
        end
    end
end

但这段代码运行非常慢,我发现它占用了92%的总运行时间。有没有更有效的方法来初始化torch7中的3D张量?

请参阅文档以了解详细信息

这些函数对张量的每个元素应用一个函数 该方法被称为(self)。这些方法比其他方法快得多 在Lua中使用for循环

文档中的示例根据索引i(内存中)初始化2D数组。下面是一个3维的扩展示例,下面是N-D张量的扩展示例。在我的机器上使用apply方法要快得多:

require 'torch'

A = torch.Tensor(100, 100, 1000)
B = torch.Tensor(100, 100, 1000)

function func(i,j,k) 
    return i*j*k    
end

t = os.clock()
for i=1,A:size(1) do
    for j=1,A:size(2) do
        for k=1,A:size(3) do
            A[{i, j, k}] = i * j * k
        end
    end
end
print("Original time:", os.difftime(os.clock(), t))

t = os.clock()
function forindices(A, func)
  local i = 1
  local j = 1
  local k = 0
  local d3 = A:size(3)
  local d2 = A:size(2) 
  return function()
    k = k + 1
    if k > d3 then
      k = 1
      j = j + 1
      if j > d2 then
        j = 1
        i = i + 1
      end
    end
    return func(i, j, k)
  end
end

B:apply(forindices(A, func))
print("Apply method:", os.difftime(os.clock(), t))

编辑

这适用于任何张量对象:

function tabulate(A, f)
  local idx = {}
  local ndims = A:dim()
  local dim = A:size()
  idx[ndims] = 0
  for i=1, (ndims - 1) do
    idx[i] = 1
  end
  return A:apply(function()
    for i=ndims, 0, -1 do
      idx[i] = idx[i] + 1
      if idx[i] <= dim[i] then
        break
      end
      idx[i] = 1
    end
    return f(unpack(idx))
  end)
end

-- usage for 3D case.
tabulate(A, function(i, j, k) return i * j * k end)
函数表(A,f)
本地idx={}
本地ndims=A:dim()
本地尺寸=A:size()
idx[ndims]=0
对于i=1,(ndims-1)do
idx[i]=1
结束
返回A:apply(函数()
对于i=ndims,0,-1 do
idx[i]=idx[i]+1

如果idx[i]A
的大小是多少?不客气!(注释已删除,因为这之后不再相关)回答得很好!只要函子能够正确地进行JIT编译,它就会非常快(接近C速度)非常感谢@rpattiso。这正是我想要的,尽管我花了一些时间弄清楚了ForIndexs()的用法行得通。这真的很有帮助。顺便问一下,你是怎么想到这个函数的?你读过Torch7的C源代码吗?@MarsPlus我很高兴它有帮助!我读过文档,看到他们如何使用全局变量
I
将张量初始化为一个序列,并在传递给应用的函数中递增它。然后我将其扩展到3d,模仿loo附言