Lua torch7神经网络训练误差
我正在尝试在torch7中实现一个神经网络示例。我的数据以以下形式存储在文本文件中[19列x 10000行]:Lua torch7神经网络训练误差,lua,neural-network,torch,Lua,Neural Network,Torch,我正在尝试在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 4
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
#随机梯度:训练
/home/yosaikan/torch/install/share/lua/5.1/nn/Linear.lua:34:尝试调用方法“dim”(一个nil值)
堆栈回溯:
/home/yosaikan/torch/install/share/lua/5.1/nn/Linear.lua:34:in函数“updateOutput”
…e/yosaikan/torch/install/share/lua/5.1/nn/Sequential.lua:25:功能“前进”
…an/torch/install/share/lua/5.1/nn/StochasticGradient.lua:35:功能“训练”
iparseSchemeConversion.lua:45:在主块中
[C] :在函数“f”中
[字符串“local f=function()返回dofile'iparseSch…”]:1:在主块中
[C] :在函数“xpcall”中
/home/yosaikan/torch/install/share/lua/5.1/itorch/main.lua:174:功能正常
/home/yosaikan/torch/install/share/lua/5.1/lzmq/poller.lua:75:函数“poll”
…/yosaikan/torch/install/share/lua/5.1/lzmq/impl/loop.lua:307:在函数“poll”中
…/yosaikan/torch/install/share/lua/5.1/lzmq/impl/loop.lua:325:函数“sleep_ex”
…/yosaikan/torch/install/share/lua/5.1/lzmq/impl/loop.lua:370:在函数“启动”中
/home/yosaikan/torch/install/share/lua/5.1/itorch/main.lua:341:in-main块
[C] :在函数“require”中
(命令行):1:在主块中
[C] :在0x00405980处
你能帮帮我吗
多谢各位
我收到了这个错误消息[…]你能帮我吗
在您的数据集中,input
和output
应该是Tensor
-s(此处input
是一个普通的Lua表,这就是您获得此错误的原因,即没有dim
方法)
为了简化数据加载,我建议您使用,例如,您可以使用将数据加载到张量中
首先,确保向文件中添加标题(作为第一行),如:
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).权重
和mlp:get(1).偏差
。关于规范化/重缩放:您可以进行实验。@delthel。此方法读取整个data.csv两次。有没有一种方法可以读取一次数据,然后将其分为输入和标签?下面是一个简单的示例(数据首先加载到表中,然后转换为张量),它可以与csv解析器一起使用:。很棒的主题家伙!实际上我也有同样的问题。我对代码的设置与您的建议基本相同,但是我得到了一个错误“尝试索引upvalue‘输入’(一个数值)堆栈回溯:/Users/robertgrzesik/Lua/async master/tests/dp test.Lua:29:in function‘size’…ik/torch/install/share/Lua/5.1/nn/StochasticGradient.Lua:19:in function‘train function’”,它指的是“dataset.size=函数(自)返回输入:size(1)end”。有什么想法吗?