Torch7神经网络训练错误

4

我想在torch7中实现一个神经网络示例。我的数据以文本文件的形式存储,格式为[19列x 10000行]:

11 38 20 44 11 38 21 44 29 42 30 44 34 38  6 34 45 42 1
11 38 20 44 11 38 27 44 31 42 18 44 34 38  6 34 45 42 2
6  42 20 44 11 38 21 44 29 42 30 44 34 38  6 34 45 42 3
...
34 40 20 44 11 38 21 44 29 38 30 38 34 45 38  0  0  0 100
...

带有最后一列[100个标签]的标签。

使用以下代码:

require 'nn'
-- ======================================= --
--           Start loading data   
-- ======================================= --
print '[INFO] Loading data..'
dataset = {}
function dataset:size() return 10000 end 
local lin = 1

train_file = 'train_10000.t7'
local file = io.open(train_file)
if file then
    for line in file:lines() do
            local input = torch.Tensor(18);
            local output = torch.Tensor(1);

        local X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14, X15, X16, X17, X18, Y = unpack(line:split(" "))                

        input  = {X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14, X15, X16, X17, X18}
        output = Y

        dataset[lin] = {input, output}        
        lin = lin +1        
    end
end
-- ======================================= --
--                 Create NN   
-- ======================================= --
print '[INFO] Creating NN..'
mlp = nn.Sequential();  -- make a multi-layer perceptron
inputs = 18; outputs = 1; HUs = 25; -- parameters
mlp:add(nn.Linear(inputs, HUs))
mlp:add(nn.Tanh())
mlp:add(nn.Linear(HUs, outputs))
-- ======================================= --
--           MSE and Training  
-- ======================================= --
print '[INFO] MSE and train NN..'
criterion = nn.MSECriterion()  
trainer = nn.StochasticGradient(mlp, criterion)
trainer.learningRate = 0.01
trainer:train(dataset)   

我收到了这个错误信息:
# StochasticGradient: training  
/home/yosaikan/torch/install/share/lua/5.1/nn/Linear.lua:34: attempt to call method 'dim' (a nil value)
stack traceback:
    /home/yosaikan/torch/install/share/lua/5.1/nn/Linear.lua:34: in function 'updateOutput'
    ...e/yosaikan/torch/install/share/lua/5.1/nn/Sequential.lua:25: in function 'forward'
    ...an/torch/install/share/lua/5.1/nn/StochasticGradient.lua:35: in function 'train'
    iparseSchemeConversion.lua:45: in main chunk
    [C]: in function 'f'
    [string "local f = function() return dofile 'iparseSch..."]:1: in main chunk
    [C]: in function 'xpcall'
    /home/yosaikan/torch/install/share/lua/5.1/itorch/main.lua:174: in function </home/yosaikan/torch/install/share/lua/5.1/itorch/main.lua:140>
    /home/yosaikan/torch/install/share/lua/5.1/lzmq/poller.lua:75: in function 'poll'
    .../yosaikan/torch/install/share/lua/5.1/lzmq/impl/loop.lua:307: in function 'poll'
    .../yosaikan/torch/install/share/lua/5.1/lzmq/impl/loop.lua:325: in function 'sleep_ex'
    .../yosaikan/torch/install/share/lua/5.1/lzmq/impl/loop.lua:370: in function 'start'
    /home/yosaikan/torch/install/share/lua/5.1/itorch/main.lua:341: in main chunk
    [C]: in function 'require'
    (command line):1: in main chunk
    [C]: at 0x00405980

你能帮我一下吗?

谢谢。

1个回答

5

我收到了这个错误信息[...],你能帮我吗?

在你的数据集中,inputoutput 应该是 Tensor 类型(这里的 input 是一个普通的 Lua 表,所以你会遇到这个错误,即没有 dim 方法)。

为了简化数据加载过程,建议使用 csv 解析器 ,例如你可以使用 csv2tensor 将数据加载到一个 Tensor 中。

首先,请确保将文件添加一个标题行(作为第一行):

x001,x002,x003,x004,x005,x006,x007,x008,x009,x010,x011,x012,x013,x014,x015,x016,x017,x018,label

然后按如下方式加载您的数据:
local csv2tensor = require 'csv2tensor'

local inputs = csv2tensor.load("data.csv", {exclude={"label"}})
local labels = csv2tensor.load("data.csv", {include={"label"}})

local dataset = {}

for i=1,inputs:size(1) do
  dataset[i] = {inputs[i], torch.Tensor{labels[i]}}
end

dataset.size = function(self)
  return inputs:size(1)
end

使用此数据集进行训练:

-- ...
trainer:train(dataset)

你可以通过 mlp:getParameters() 获取权重(请参考此文档),或者通过单独的模块获取,例如 mlp:get(1).weightmlp:get(1).bias。关于归一化/重新缩放:你也可以进行一些实验。 - deltheil
@deltheil。这个方法两次读取整个data.csv文件。有没有一种方法可以只读取一次,然后将其分成输入和标签? - David Doria
这是一个天真的例子(数据首先加载到表中,然后转换为张量),可与此csv解析器一起使用:convert.lua。链接 - deltheil
由于某种原因,在您的代码中inputs不是一个张量,而是一个数字,因此出现了这个错误。您应该仔细检查为什么会这样(也许您在此期间替换了变量)。 - deltheil
太好了。我通过预设变量来解决了它(也许发生了一些奇怪的内存问题?)。但是,我遇到了另一个问题,你认为可以看一下吗?http://stackoverflow.com/questions/29458330/size-mismatch-in-function-addmv-in-torch7 - Rob
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接