我最近在阅读的一些Lua源文件中经常看到这种语法,这是什么意思,尤其是第二对括号
例如,第8行
https://github.com/karpathy/char-rnn/blob/master/model/LSTM.lua
local LSTM = {}
function LSTM.lstm(input_size, rnn_size, n, dropout)
dropout = dropout or 0
-- there will be 2*n+1 inputs
local inputs = {}
table.insert(inputs, nn.Identity()()) -- line 8
-- ...
nn.Identity
的源代码https://github.com/torch/nn/blob/master/Identity.lua
**********更新**************
()()模式在火炬库'nn'中经常使用。第一对括号创建容器/节点的对象,第二对括号引用从属节点。
例如,y = nn.Linear(2,4)(x)表示x连接到y,并且变换从1 * 2到1 * 4是线性的。
我只是了解用法,它的接线方式似乎可以通过以下答案之一得到解答。
无论如何,该接口的用法在下面有详细记录。
https://github.com/torch/nngraph/blob/master/README.md
最佳答案
作为余浩回答的补充,让我给出一些与Torch相关的精度:nn.Identity()
创建一个身份模块,
在此模块上调用的()
会触发nn.Module
__call__
(由于Torch类系统将其正确地连接到了元表中),
默认情况下,此__call__
方法执行前进/后退,
但是这里使用torch/nngraph,并且nngraph会覆盖此方法,如您所见here。
因此,每个nn.Identity()()
调用在这里都具有返回一个nngraph.Node({module=self})
节点的作用,其中self引用当前的nn.Identity()
实例。
-
更新:LSTM-s中有关此语法的图示在here中:
local i2h = nn.Linear(input_size, 4 * rnn_size)(input) -- input to hidden
如果您不熟悉
nngraph
,那么我们正在构建模块并已经通过图节点再次调用它可能看起来很奇怪。实际发生的是第二个调用将nn.Module
转换为nngraph.gModule
,并且参数在图中指定了其父级。关于lua - Lua中的()()语法是否有特殊含义,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30983354/