为什么torch.Tensor有一个libjpeg字段?

我看到的是:

./install/share/lua/5.1/image/init.lua:   return torch.Tensor().libjpeg.size(filename)

Tensor如何获取libjpeg字段?我没有在Tensor.lua中看到它被引用。

为了更多的上下文,我正在尝试调试这个错误:

 /Users/un/torch/install/share/lua/5.1/image/init.lua:140: attempt to index field 'libjpeg' (a nil value)
stack traceback:
    /Users/un/torch/install/share/lua/5.1/image/init.lua:140: in function 'loader'
    /Users/un/torch/install/share/lua/5.1/image/init.lua:276: in function 'load'
    /Users/un/torch/install/share/lua/5.1/image/init.lua:1067: in function 'lena'
    [string "image.lena();"]:1: in main chunk
    [C]: in function 'xpcall'
    /Users/un/torch/install/share/lua/5.1/trepl/init.lua:588: in function 'repl'
    .../torch/install/lib/luarocks/rocks/trepl/scm-1/bin/th:185: in main chunk
    [C]: at 0x0104de8640
点赞
用户117844
用户117844

在 Torch 包中的常见做法是将 tensor 表作为一种命名空间。这是一个很有用的技巧,可用于快速执行模板化函数分派。

例如,如果你加载了 nn 包,你会发现如下函数:

torch.DoubleTensor.nn.L1Cost_updateOutput
torch.FloatTensor.nn.L1Cost_updateOutput

这些函数通常根据输入 tensor 的类型进行调用。例如:

input = torch.FloatTensor()
input.nn.L1Cost_updateOutput(...)

这也是使用 image 加载包时会出现的现象。你会注意到会有 torch.FloatTensor.libjpeg* 和 _torch.DoubleTensor.libjpeg*_。

我怀疑你可能已将默认 tensor 类型设置为 _torch.CudaTensor_,这导致你观察到这个错误。因为 image 包的函数并未定义为 Cuda tensor,所以函数 torch.CudaTensor.libjpeg* 将不存在。

解决方案是将默认的 tensor 类型设置为 FloatTensor 或 DoubleTensor,并在需要时创建任何 Cuda tensors。

2015-02-14 11:26:54