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

时间:2015-02-14 05:10:15

标签: lua torch

我明白这一点:

./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    

1 个答案:

答案 0 :(得分:2)

Torch包中的常见做法是使用张量表作为命名空间。这是一个快速和脏的模板化函数调度有用的技巧。 例如,如果您加载 nn 包,您将找到函数

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

这些通常根据输入张量的类型调用。例如:

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

这是您使用 torch.Tensor.libjpeg * 观察到的内容 如果你使用图像加载包,那么你会注意到会有 torch.FloatTensor.libjpeg * torch.DoubleTensor.libjpeg *

我怀疑您可能已将默认张量类型设置为 torch.CudaTensor ,这时您会发现此错误。 由于没有为Cuda张量定义图像包的功能,因此 torch.CudaTensor.libjpeg * 函数将不存在。

您的解决方案是将默认张量类型设置为FloatTensor或DoubleTensor,并根据需要创建任何Cuda张量。