nn.CDivTable在backward被调用时是否有有效的原因引起错误?
2018-9-27 10:34:20
收藏:0
阅读:65
评论:1
我最近开始使用Torch框架和Lua脚本语言进行神经网络的探索。我掌握了线性网络的基础知识,因此尝试了更加复杂但简单的东西:
想法是我有3个输入,我必须选择前两个,将它们除以并将结果转发给线性模块。因此,我制作了这个小脚本:
require "nn";
require "optim";
local N = 3;
local input = torch.Tensor{
{1, 2, 3},
{9, 20, 20},
{9, 300, 1},
};
local output = torch.Tensor(N);
for i=1, N do
output[i] = 1;
end
local ratioPerceptron = nn.Sequential();
ratioPerceptron:add(nn.Narrow(1, 1, 2));
ratioPerceptron:add(nn.CDivTable());
ratioPerceptron:add(nn.Reshape(N, 1));
ratioPerceptron:add(nn.Linear(1, 1));
ratioPerceptron:add(nn.Sigmoid());
local criterion = nn.BCECriterion();
local params, gradParams = ratioPerceptron:getParameters();
local optimState = {learningRate = 0.01};
local maxIteration = 100000;
for i=1, maxIteration do
local function f(params)
gradParams:zero();
local outputs = ratioPerceptron:forward(input);
local loss = criterion:forward(outputs, output);
local dloss_doutputs = criterion:backward(outputs, output);
ratioPerceptron:backward(input, dloss_doutputs);
return loss, gradParams;
end
optim.sgd(f, params, optimState);
end
在训练期间调用backward时,这将失败并显示以下错误:
CDivTable.lua:21: both torch.LongStorage and (null) have no addition operator
但如果我从sequential模块中删除CDivTable,并将nn.Reshape和nn.Linear更改为二维输入(因为我们删除了将二维输入除以产生一维输出的CDivTable),则会像这样完全没有错误地完成训练:
local ratioPerceptron = nn.Sequential();
ratioPerceptron:add(nn.Narrow(1, 1, 2));
ratioPerceptron:add(nn.Reshape(N, 2));
ratioPerceptron:add(nn.Linear(2, 1));
ratioPerceptron:add(nn.Sigmoid());
是否有其他方法可以将两个选择的输入除以并将结果转发到线性模块?
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

模块
CDivTable接受一个表格作为输入,并将第一个表格的元素除以第二个表格的元素。在这里,你将一个单独的输入馈送到你的网络中,而不是一个包含两个输入的表格。这就是为什么我认为你遇到了null的错误。Torch 无法理解你的输入(它由两个向量组成)应该被视为两个向量的表格。它只看到一个大小为2x3的张量!因此,你必须告诉 Torch从输入中创建一个表格。因此,你可以使用模块SplitTable(dim),它将沿着维度dim将输入拆分为表格。在狭缩模块之后插入这一行
ratioPerceptron:add(nn.SplitTable(1)):local ratioPerceptron = nn.Sequential(); ratioPerceptron:add(nn.Narrow(1, 1, 2)); ratioPerceptron:add(nn.SplitTable(1)) ratioPerceptron:add(nn.CDivTable()); ratioPerceptron:add(nn.Reshape(N, 1)); ratioPerceptron:add(nn.Linear(1, 1)); ratioPerceptron:add(nn.Sigmoid());此外,在遇到此类错误时,我建议你通过加入
print语句来查看网络计算的内容:在添加导致错误的模块的代码行之前加入一行print(ratioPerceptron:forward(input))。